1. 程式人生 > >iOS開發中NSUInteger帶來的坑

iOS開發中NSUInteger帶來的坑

場景描述:

看下面程式碼的輸出結果是什麼?

	NSInteger index = 0;
    NSUInteger length = 0;
    if (index > length - 1) {
        NSLog(@"0大於-1");
    }else {
        NSLog(@"0不大於-1");
    }

輸出結果是:0不大於-1

原因分析

首先,我們列印一下length - 1的值,NSLog(@"length - 1 = %ld", length - 1);,輸出結果為length - 1 = -1,那麼為什麼結果是0不大於-1,而不是0大於-1呢?
我們換一種方式列印一下length - 1

的值,NSLog(@"length - 1 = %lu", length - 1);輸出結果為length - 1 = 18446744073709551615,到這裡應該明白為什麼會這樣了,因為lengthNSUInteger型別,所以length - 1也是NSUInteger型別。(注:NSIntegerlong型別,NSUIntegerunsigned long型別)

解決辦法

方法一:強制型別轉換

	NSInteger index = 0;
    NSUInteger length = 0;
    if (index > (NSInteger)length - 1) {
        NSLog(@"0大於-1");
    }else {
        NSLog(@"0不大於-1");
    }

輸出結果是:0大於-1

方法二:避免NSUInteger型別數做減法

    NSInteger index = 0;
    NSUInteger length = 0;
    if (index + 1 > length) {
        NSLog(@"0大於-1");
    }else {
        NSLog(@"0不大於-1");
    }

輸出結果是:0大於-1