Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我会收到此if条件的编译器警告?_Objective C_Xcode - Fatal编程技术网

Objective c 为什么我会收到此if条件的编译器警告?

Objective c 为什么我会收到此if条件的编译器警告?,objective-c,xcode,Objective C,Xcode,我在函数中使用此条件,并在xCode中得到以下编译器警告: 无符号表达式>=0的比较始终为真 这怎么可能是真的?如果nowPlayingIndex的值是nowPlayingIndex显然是无符号的,那么nowPlayingIndex-1永远不能为负。因此,正如编译器警告您的那样,该条件始终为真。nowPlayingIndex显然是无符号的,因此nowPlayingIndex-1永远不能为负。因此,编译器警告您,条件始终为true。我确信nowPlayingIndex的类型是无符号整数类型。如果是

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

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

这怎么可能是真的?如果nowPlayingIndex的值是nowPlayingIndex显然是无符号的,那么nowPlayingIndex-1永远不能为负。因此,正如编译器警告您的那样,该条件始终为真。

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

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

因此,你应该写:

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也是。通常情况下,缓冲区溢出意味着你实际上溢出了缓冲区,并意外地写入了缓冲区之外的内存。这是另一回事。整数溢出是一个更好的术语。此处的二进制表示形式也不正确,请参见。这些观点对于理解最初的问题是没有必要的。我的错。有点像是在我脑子里想出来的。谢谢你注意到这一点。不管怎么说,我认为最好能看到计算内部发生了什么,以确切地了解为什么会出现这种情况。通常情况下,缓冲区溢出意味着您实际上溢出了缓冲区,并意外地写入了缓冲区之外的内存。这是另一回事。整数溢出是一个更好的术语。此处的二进制表示形式也不正确,请参见。这些观点对于理解最初的问题是没有必要的。我的错。有点像是在我脑子里想出来的。谢谢你注意到这一点。不管怎么说,我觉得很高兴看到计算中发生了什么,以确切地了解为什么这样的事情是这样的。