Objective c 为什么我会收到此if条件的编译器警告?
我在函数中使用此条件,并在xCode中得到以下编译器警告: 无符号表达式>=0的比较始终为真 这怎么可能是真的?如果nowPlayingIndex的值是nowPlayingIndex显然是无符号的,那么nowPlayingIndex-1永远不能为负。因此,正如编译器警告您的那样,该条件始终为真。nowPlayingIndex显然是无符号的,因此nowPlayingIndex-1永远不能为负。因此,编译器警告您,条件始终为true。我确信nowPlayingIndex的类型是无符号整数类型。如果是这样,那么nowPlayingIndex-1也将是无符号整数类型,它永远不能为负,因此nowPlayingIndex-1始终大于或等于0 因此,你应该写:Objective c 为什么我会收到此if条件的编译器警告?,objective-c,xcode,Objective C,Xcode,我在函数中使用此条件,并在xCode中得到以下编译器警告: 无符号表达式>=0的比较始终为真 这怎么可能是真的?如果nowPlayingIndex的值是nowPlayingIndex显然是无符号的,那么nowPlayingIndex-1永远不能为负。因此,正如编译器警告您的那样,该条件始终为真。nowPlayingIndex显然是无符号的,因此nowPlayingIndex-1永远不能为负。因此,编译器警告您,条件始终为true。我确信nowPlayingIndex的类型是无符号整数类型。如果是
if(nowPlayingIndex-1 >= 0){ }
我确信nowPlayingIndex的类型是无符号整数类型。如果是这样,那么nowPlayingIndex-1也将是无符号整数类型,它永远不能为负,因此nowPlayingIndex-1始终大于或等于0
因此,你应该写:
if(nowPlayingIndex-1 >= 0){ }
如果nowplayingindex未签名,则不能小于0。如果我减去1,无符号获胜,我得到这个数据类型可能的最大值,仍然是一个正数
您必须使用有符号的值或强制转换为此类值。如果nowplayingindex是无符号的,则不能小于0。如果我减去1,无符号获胜,我得到这个数据类型可能的最大值,仍然是一个正数
您必须使用有符号的值或转换为此类值。您没有提到nowPlayingIndex的数据类型。请参阅我的评论。 如果它是unsigned int,那么这就是您的问题 为了好玩,试着从一个初始值为0的无符号整数中减去1。
检查您的结果。您没有提到nowPlayingIndex的数据类型。请参阅我的评论。 如果它是unsigned int,那么这就是您的问题 为了好玩,试着从一个初始值为0的无符号整数中减去1。
检查您的结果。这有点奇怪,但请尝试以下方法,看看是否有帮助
if ( nowPlayingIndex >= 1 )
这有点奇怪,但是试试下面的方法,看看是否有帮助
if ( nowPlayingIndex >= 1 )
NowPlayindex似乎未签名。这意味着它总是积极的。如果为负数,则会出现缓冲区溢出下溢 看看这些东西在二进制中是如何工作的……以8位有符号整数为例:
if ((nowPlayingIndex - 1) >= 0)
{
//logic
}
未签名的:
10000000 (-127)
10000001 (-126)
编辑:修正了数字
最左边的位或符号位决定您的数字是+还是-。当它是1时,你可以认为它是-127,所以当你把它加到你的跑步总数时,你得到一个负数。但是,对于8位无符号整数,符号位的值为+127。这也是有符号整数不能像无符号整数那样存储大+数的原因。NowPlayindex似乎是无符号的。这意味着它总是积极的。如果为负数,则会出现缓冲区溢出下溢 看看这些东西在二进制中是如何工作的……以8位有符号整数为例:
if ((nowPlayingIndex - 1) >= 0)
{
//logic
}
未签名的:
10000000 (-127)
10000001 (-126)
编辑:修正了数字
最左边的位或符号位决定您的数字是+还是-。当它是1时,你可以认为它是-127,所以当你把它加到你的跑步总数时,你得到一个负数。但是,对于8位无符号整数,符号位的值为+127。这也是有符号整数不能像无符号整数那样存储大+数的原因。根据前面的正确答案展开,如果nowPlayingIndex==0,则nowPlayingIndex-1是其类型的最大值,例如UINT_MAX,可能是4294967295 你可能想写:
10000000 (127)
10000001 (128)
或
根据前面的正确答案展开,如果nowPlayingIndex==0,则nowPlayingIndex-1是其类型的最大值,例如UINT_MAX,可能是4294967295 你可能想写:
10000000 (127)
10000001 (128)
或
如果nowPlayingIndex是无符号字符
if (nowPlayingIndex >= 1 { ... }
如果nowPlayingIndex是无符号字符
if (nowPlayingIndex >= 1 { ... }
它的意思和罐头上写的一模一样。nowPlayingIndex是无符号的,nowPlayingIndex-1也是无符号的,所有无符号值都>=0 尝试改用有符号的值。自从我重写了我所有的东西,更精确地使用我自己的int32符号值以来,一切都变得更简单,正确性也更容易保证
如果这太费劲了,或者不可能,只需使用nowPlayingIndex>=1即可。它的意思与tin上的意思完全相同。nowPlayingIndex是无符号的,nowPlayingIndex-1也是无符号的,所有无符号值都>=0 尝试改用有符号的值。自从我重写了我所有的东西,更精确地使用我自己的int32符号值以来,一切都变得更简单,正确性也更容易保证 如果这太费劲,或者不可能,只需使用nowPlayingIndex>=1。如果您错了,0-1可能大于0。我将向你展示:
unsigned char nowPlayingIndex = 0;
nowPlayingIndex = nowPlayingIndex - 1; // 255 (UCHAR_MAX in limits.h)
<
p> 你错了,0-1可以大于0。我将向你展示:
unsigned char nowPlayingIndex = 0;
nowPlayingIndex = nowPlayingIndex - 1; // 255 (UCHAR_MAX in limits.h)
好了。变量NowPlayinIndex可能是一个无符号整数,表示一个正数,它总是>=0。变量NowPlayinIndex可能是一个无符号整数,表示一个正数,它总是>=0。NowPlayinIndex的类型是什么,如果它是无符号int,那么它总是正确的。那么,有谁能比编译器警告更能解释这一点呢?这就是为什么你应该总是注意编译器警告的原因之一。C++还是ObjuleC?下定决心。哦,当然是一个未签名的int。我真傻…:谢谢各位。我今天没有很好的一天。什么是NoWaldPING索引,如果它是无符号int,那么它总是正确的。那么,有人能比编译器警告更好地解释这一点吗?这就是你应该始终注意编译器警告的原因之一。C++还是ObjuleC?下定决心。哦,当然是一个未签名的int。我真傻…:谢谢各位。我今天过得不太好。你读过OP发布的警告了吗?它与运算符优先级无关。它不会有什么区别。-优先级高于>=。您是否阅读了OP发布的警告?它与运算符优先级无关。它不会有什么区别。-优先级高于>=。谁允许您在示例中使用我的名字;弗拉格,我想我应该把它改成福。我倾向于使用fred、barney、wilma、betty和george作为元语法变量。是的,Marshall Cline也是。谁允许你在例子中使用我的名字;弗拉格,我想我应该把它改成福。我倾向于使用fred、barney、wilma、betty和george作为元语法变量。是的,Marshall Cline也是。通常情况下,缓冲区溢出意味着你实际上溢出了缓冲区,并意外地写入了缓冲区之外的内存。这是另一回事。整数溢出是一个更好的术语。此处的二进制表示形式也不正确,请参见。这些观点对于理解最初的问题是没有必要的。我的错。有点像是在我脑子里想出来的。谢谢你注意到这一点。不管怎么说,我认为最好能看到计算内部发生了什么,以确切地了解为什么会出现这种情况。通常情况下,缓冲区溢出意味着您实际上溢出了缓冲区,并意外地写入了缓冲区之外的内存。这是另一回事。整数溢出是一个更好的术语。此处的二进制表示形式也不正确,请参见。这些观点对于理解最初的问题是没有必要的。我的错。有点像是在我脑子里想出来的。谢谢你注意到这一点。不管怎么说,我觉得很高兴看到计算中发生了什么,以确切地了解为什么这样的事情是这样的。