NSInteger的绝对值

35
3个回答

66

使用NSObjCRuntime.h中定义的ABS()宏,它是与架构无关的。


NSObjCRuntime.h提示已解决。谢谢。 - user500

18
你可以使用Foundation的ABS()宏:
NSInteger a = 5;
NSInteger b = -5;
NSLog(@"%ld %ld", ABS(a), ABS(b));

+1 我用 MAXMIN 已经好几年了,从来没见过 ABS。知道了真好。 - Rob Napier
2
我以前从未知道:+1。无论如何,C库中的abs()函数不太好,因为它的参数是一个C int,在OS X开发环境中通常是32位,而NSInteger与架构相同,即32位或64位。 - JeremyP

3

虽然两个回答中使用ABS()宏是完全正确的,但应该注意到NSIntegerMin的真实绝对值无法表示为NSInteger,当调用ABS()函数时,它返回自身。

假设是64位系统:

NSLog(@"ld", ABS(NSIntegerMin)); 
// prints: -9223372036854775808

NSLog(@"%ld", ABS(NSIntegerMin + 1)); 
// prints: 9223372036854775807, which == NSIntegerMax

在32位系统上也会产生相同的结果,但数字将为+2147483647和-2147483648。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接