比较C中的负数
回答
你必须了解不同变量类型之间的区别。变量类型如int
,unsigned
,size_t
等有不同的行为,并基于你得到的结果。
如果你真的想比较两个数字,他们都必须在同一水平(变量类型),否则你会得到意想不到的结果。
以下将解决您的问题。
if(tmp > (int)len)
ft_putstr("this is crazy");
由于@jblixr建议(对于评论的感谢),你可能要采取sizeof
这些变量类型的照顾,并确保当从一种数据类型转换值到另一种数据类型的值不被丢失。
你认为这是一个很好的解决方案啊?如果'len'与'4294967295'类似,会发生什么?那么'len'将被视为负数。 –
@jblixr如果您指的是sizeof'size_t'和'int';没有。 – Pawan
“size_t”值大于“INT_MAX”的可能性有多大?不是特别的。这种比较在大多数情况下都很好。 –
这里的问题是,你正试图比较一些未签名的东西和已签名的东西。这意味着在实际转换完成之前有一个隐式转换。在这种情况下,signed被转换为unsigned(这通常不是人们想要的 - 因此许多编译器可以选择在完成时显示警告)。
要做到这一点你会写一个草率的方式比较正确:
if((int)tmp > (int)len)
但是这忽略了一个事实size_t
可以有一个是int
值过大。严格来说,必须处理int
与size_t
的范围相结合的范围可以大于任何可用的类型。这意味着你将不得不在两种情况下处理这个问题,所以你会使用这个事实,即如果tmp<0
那么tmp<len
(数学上,因为len>=0
)。因此,例如在数学上tmp<len
将被写为tmp<0 || tmp<len
。而相反的是tmp>=0 && tmp >= len
。因此,你应该写:
if(tmp >= 0 && tmp > len)
注意,则转换是没有问题的,tmp
可以在第一次检查后转换为无无值改变,int
和size_t
不同范围也不是问题作为比较之前,较小者转换为较宽范围。
剩下的唯一问题是,如果您启用了关于带符号无符号比较的警告(以检测这些类型的错误),它仍会警告。为了照顾到这一点,您需要明确地输入它,但是我们知道一旦我们检查了tmp>=0
,转换为无符号不会改变tmp
。因此,为了避免警告你可以这样写:
if(tmp >= 0 && (unsigned)tmp > len))
的(unsigned)
是因为tmp
是int
,你需要转换为无符号时,如果tmp
是另一种类型的尊重类型。
- 1. 比较负数中的负数
- 2. 负整数比较
- 3. 比较JQuery函数中的负数
- 4. 在Acrobat中比较负值
- 5. 比较C中的数字
- 6. Java的整数MIN_VALUE负,则比较
- 7. python比较正数和负数
- 8. Apache RewriteCond中变量的负面比较
- 9. 整数比较C#
- 10. 比较整数C++
- 11. C++比较双数
- 12. 将数值与js中Datatable中的负数进行比较
- 13. 服务器负载比较
- 14. 熊猫 - 比较正/负值
- 15. c#中比较位图(签名)比较#
- 16. 在c/C++中比较float和整数
- 17. 比较和比较的负值和正值返回值
- 18. 比较C++中的2个整数
- 19. 比较两个数据表中的c#
- 20. C# - 比较两个数组中的值
- 21. C++比较数组中的列元素
- 22. C++中的数组字符串比较
- 23. C++中的可比较数组
- 24. 比较C++中的数组元素
- 25. 比较C++中数组的元素
- 26. 字符串比较与目标C中的类比较-C
- 27. c中的字符比较?
- 28. 比较C++中的空缺
- 29. C中的字符比较
- 30. 比较C++中的双打
这是因为'size_t'是一个无符号整数类型,所以当比较一个有符号整数类型时,就会执行无符号比较。 –
尝试'if(tmp> 0 && tmp> len)' – user3386109
'printf(“%zu”,tmp);'会导致未定义的行为。使用'printf',您可以使用正确的格式说明符。 –