如果没有无法保证(甚至似乎也没有机会),那么可以拥有一个单独的无符号类型(又称为NSUInteger
),这是什么意思呢?名称暗示-本质上非负的结果。
NSUInteger normal = 5;
NSUInteger freaky = normal - 55;
NSLog(@"%ld, %ld", normal, freaky);
NSLOG
5, -50
当然,我可以向后弯腰以获取零或某种归一化值...
NSUInteger nonNeg = (((normal - 55) >= 0) ? (normal - 55) : 0);
PARRALELUNIVERSELOG
5, -50
但是在这里,编译器提示..正确,所以
comparison of unsigned expression >= 0 is always true
-就是这样,这是我不希望/期望的答案。有人拍打我的脸,给我喝一杯,告诉我那是什么年..或者更好的……如何做到这一点-你知道-不要那样做。 最佳答案
%ld
告诉NSLog
将其打印为有符号整数。尝试%lu
。
请参阅Wikipedia上的2's Complement,以了解有关位级别发生的情况的说明。
这里发生的是,减法导致无符号整数表示形式回绕。为了防止这种情况,您需要在进行减法之前进行检查。
NSUInteger x = 5;
NSUInteger y = 55;
// If 0 makes sense in your case
NSUInteger result = (x >= y) ? (x - y) : 0;
// If it should be an error
if(x < y)
{
// Report error
}
关于objective-c - 为什么/NSUInteger如何返回负数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11771710/