arc4random_uniform()和arm64的不同行为

时间:2013-10-21 22:13:55

标签: ios arm arc4random

给出以下代码 NSInteger random = arc4random_uniform(3) - 1;

为armv7编译的代码,armv7和i386(在iPhone 5和iOS模拟器上测试)产生元素{-1,0,1}的均匀分布;但是当为arm64编译并在iPhone 5s上运行它会产生{4294967295,0,1}?

1 个答案:

答案 0 :(得分:3)

arc4random_uniform返回一个unsigned int, - 1就会返回最大的32位整数4294967295。

你需要先将arc4random_uniform(3)强制转换为int,然后再加上它。

64位32位无符号/有符号整数问题的示例

规则4:有符号值的有符号值和无符号值的总和是无符号值。

int a=-2;
unsigned int b=1;
long c = a + b;
long long d=c; // to get a consistent size for printing.

printf(“%lld \ n”,d); 问题:在32位运行时执行此代码时,结果为-1(0xffffffff)。当代码在64位运行时运行时,结果是4294967295(0x00000000ffffffff),这可能不是您所期望的。

原因:为什么会发生这种情况?首先,添加两个数字。有符号值加无符号值会产生无符号值(规则4)。接下来,该值将提升为更大的类型。此促销不会导致签名延期。

解决方案:要以32位兼容的方式解决此问题,请将b转换为长整数。此转换强制在添加之前将b的非符号扩展提升为64位类型,从而强制有符号整数被提升(以有符号的方式)以匹配。通过该更改,结果是预期的-1。

stolen from the apple 64-Bit Transition Guide.