繁体   English   中英

if语句Objective-C内部的评估(NSIntegers)

[英]Evaluation (NSIntegers) inside if-statement Objective-C

我对此感到怀疑,为什么它可以正常工作:

NSInteger row = indexPath.row;
NSInteger preloadTrigger = self.nodes.count - 20;
if (row >= preloadTrigger) {
    [self.loader loadNextposts];
}

并且这不会(只是跳过if语句):

if (indexPath.row >= self.nodes.count - 20) {
    [self.loader loadNextposts];
}

self.nodes.count - 20的值self.nodes.count - 20为负时。

但是,当表达式的值为正数时,它总是可以正常工作。

一种非常奇怪的行为,因为我看不到两个表达式的语义差异。

更新:因此,我决定对其进行测试:

(lldb) po self.nodes.count - 20
18446744073709551601

(lldb) po preloadTrigger
-15

根据Apple Docs的说法,count属性是Objective-C中的NSUInteger

当你写:

 NSInteger preloadTrigger = self.nodes.count - 20;

实际上,您正在将count转换为NSInteger对象,如果count不大于20,则可NSInteger负数。

但是当你写:

(indexPath.row >= self.nodes.count - 20)

count是一个NSUInteger对象,从中减去20将始终导致一个正数(顺便说一下,这是一个很大的数)。

因为nodes.count是NSUInteger,而行是NSInteger。 无符号整数-20永远不是负值,但是会在您期望它为负数的情况下产生巨大的正值。

我将在其他正确答案中添加一些解释。

所以,这是怎么回事:

self.nodes.count的类型为NSUInteger,与64位系统中的unsigned long int相同,或者在32位系统中与unsigned int

文字20int类型。

当您形成表达式self.nodes.count - 2020被“提升”为另一个操作数( self.nodes.count )的无符号整数类型,因为它的范围更广。

这是因为,当两个操作数具有不同大小的类型时,较小的一个将被提升为较大的一个以使其相等,并以这些条件计算结果(在硬件中,不同类型的值之间的算术运算并未真正定义-位表示形式有所不同)。

问题是,为了能够用相同的位长表示更大范围的正值,无符号整数不能表示负值。 因此,当20大于self.nodes.count ,结果将“环绕”为一个大的无符号整数。

另一方面, indexPath.row也是一个无符号整数( NSUInteger ),因此您最终将比较小的行值与减法运算的巨大结果进行了比较。 考试:

if (indexPath.row >= self.nodes.count - 20)

...总是失败(左侧较小)。

如果首先将两个结果都转换为有符号整数, 然后比较这些有符号整数:

NSInteger row = indexPath.row;
NSInteger preloadTrigger = self.nodes.count - 20;
if (row >= preloadTrigger) {

...然后没有发生换行/下溢,您将获得预期的结果。

暂无
暂无

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

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