繁体   English   中英

如果出现这种情况,为什么会收到编译器警告?

[英]Why am I getting a compiler warning for this if condition?

if(nowPlayingIndex-1 >= 0){ }

我在函数中使用此条件,并且在xCode中收到以下编译器警告:

无符号表达式> = 0的比较始终为true。

这怎么可能是真的? 如果nowPlayingIndex的值nowPlayingIndex <= 0则上述条件为假。

非常感谢。

我确定nowPlayingIndex的类型是无符号整数类型。 如果是这样,那么nowPlayingIndex -1也将是无符号整数类型,该类型永远不能为负,因此nowPlayingIndex -1始终大于或等于0

因此,您应该写:

if ( nowPlayingIndex  >= 1 ) 

nowPlayingIndex显然是无符号的,因此nowPlayingIndex-1永远不能为负。 因此,条件始终为true,因为编译器会警告您。

nowPlayinfIndex似乎是未签名的。 这意味着它总是积极的。 如果为负,则将有缓冲区溢出(下溢?)

看一下这些东西在二进制中是如何工作的...以一个8位带符号整数为例:

10000000 (-127)
10000001 (-126)

带有未签名:

10000000 (127)
10000001 (128)

编辑:固定数字

最左边的位或符号位确定您的电话号码是+还是-。 当它为1时,您可以认为它是-127,因此,将其添加到运行总计中时,将得到一个负数。 但是,对于8位UNSIGNED整数,符号位的值为+127。 这也是为什么有符号整数不能存储与无符号一样大的数字。

如果nowplayingindex是无符号的,则不能< 0 如果我减去1,则无符号会获胜,并且我会获得此数据类型可能的最大值,但仍为正数。

您必须使用带符号的值或将其强制转换为此类值。

您没有提到nowPlayingIndex的数据类型是nowPlayingIndex请参阅我的评论。 如果它是unsigned int ,那是您的问题。

只是为了好玩,尝试从初始化为0的无符号整数中减去1。检查结果。

有点奇怪,但是请尝试以下操作,看看是否有帮助。

if ((nowPlayingIndex - 1) >= 0)
{
    //logic
}

扩展先前的正确答案,如果nowPlayingIndex == 0 ,则nowPlayingIndex - 1是其类型的最大值,例如UINT_MAX,可能为4294967295。

您可能想写:

if (nowPlayingIndex > 0) { ... }

要么

if (nowPlayingIndex >= 1 { ... }

如果nowPlayingIndex是unsigned char

unsigned char nowPlayingIndex = 0;
nowPlayingIndex = nowPlayingIndex - 1; // 255 (UCHAR_MAX in limits.h)

它的意思恰好是它在罐子上所说的。 nowPlayingIndex是无符号的,nowPlayingIndex-1也同样是无符号的,并且所有未签名的值> = 0。

尝试改用带符号的值。 自从我重写了所有内容以使用带符号的值(更准确地说是我自己的int32)以来,一切都变得更加简单,而且更容易确保正确性。

如果这太费力或不可能,只需使用nowPlayingIndex> = 1。

您错了, 0 - 1可以大于0。我将向您展示:

$ cat foo.cpp

#include <iostream>

int main()
{
    unsigned int foo = 0;
    ::std::cout << (foo - 1) << "\n";
    return 0;
}

$ g++ -O3 foo.cpp -o foo

$ ./foo
4294967295

妳去

变量nowPlayingIndex可能是一个无符号整数 ,代表一个正数 ,它始终> = 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM