簡體   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