gpt4 book ai didi

比较 C 中的负数

转载 作者:太空狗 更新时间:2023-10-29 16:11:03 25 4
gpt4 key购买 nike

我编写的程序有问题。该程序将进入 if 语句,而它不应该。我有两个变量:

size_t len = 5;
int tmp = -1;

当我这样做时:

if (tmp > len)
ft_putstr("this is crazy");

我打印出“这太疯狂了,而 -1 对我来说小于 5!好的好的。所以我在我最喜欢的网站上看了看 this .

尝试时:

printf("%zu", tmp) 

我看到一个很大的正数。行 !这可能是我的程序进入上述 if 条件的原因,但我怎样才能让它不进入 if 条件???谢谢

最佳答案

这里的问题是您试图将未签名的内容与已签名的内容进行比较。这意味着在实际转换完成之前涉及隐式转换。在这种情况下,有符号被转换为无符号(这通常不是人们想要的 - 因此许多编译器可以选择在完成此操作时显示警告)。

要以草率的方式更正确地做到这一点,您可以这样写:

 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一旦我们检查了 tmp>=0 .所以为了避免警告你会写:

if( tmp >= 0 && (unsigned)tmp > len) )

(unsigned)是因为tmp是一个 int ,如果 tmp,则在转换为无符号时需要考虑类型是另一种类型。

关于比较 C 中的负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35079300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com