-1
這會讓我抓狂:NSUInteger小於0,爲什麼?
NSUInteger index = -1;
if (index > 0) {
NSLog(@"Index: %d", index);
}
爲什麼它記錄:
2013-03-14 14:31:15.418 Demo[6155:907] Index: -1
???
這會讓我抓狂:NSUInteger小於0,爲什麼?
NSUInteger index = -1;
if (index > 0) {
NSLog(@"Index: %d", index);
}
爲什麼它記錄:
2013-03-14 14:31:15.418 Demo[6155:907] Index: -1
???
使用格式說明符%d
會導致您的無符號整數被解析,就像它被簽名一樣。
變化:
NSLog(@"Index: %d", index);
到:
NSLog(@"Index: %u", index);
,它會正確顯示。
或者,只要使用NSInteger
,如果您確實不需要無符號值。
問題是'整數'不知道任何有關它的簽名/無符號特徵。這只是一點點。 -1
與值0xFFFFFFFF是不變的。
如果它是有符號/無符號的,那麼類型'知道',並且在編譯時正在發出正確的處理器指令。
NSUInteger index = -1; // effectively translates to index = 0xFFFFFFFF; (all bits set)
if (index > 0) { // unsigned comparison - well, anything else than zero in unsigned comparison is bigger than zero
// so probably the JA (jump if above) asm instruction is emitted.
// if the index was NSInteger, JG will be emitted.
NSLog(@"Index: %d", index); // as others stated, you're now passing the bits of 'index' in way the NSLog treats them as signed integer
}
爲什麼匿名倒票,我想知道? – 2013-03-14 13:14:27
我覺得因爲你不在這一點。它不應該記錄任何東西,因爲-1小於0.至少這是我讀的。 – nickdnk 2015-07-18 14:23:35
@nickdnk:好的 - 謝謝 - 我現在看到代碼有兩個問題,並不能100%清楚OP所指的問題。 – 2015-07-18 14:46:15