[英]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.