给出以下代码
NSInteger random = arc4random_uniform(3) - 1;
为armv7编译的代码,armv7和i386(在iPhone 5和iOS模拟器上测试)产生元素{-1,0,1}的均匀分布;但是当为arm64编译并在iPhone 5s上运行它会产生{4294967295,0,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。