ios - arc4random_uniform()和arm64的不同行为

标签 ios arm arc4random

给出以下代码NSInteger random = arc4random_uniform(3) - 1;
这段为armv7,armv7和i386编译的代码(在iPhone 5和iOS Simulator上测试)产生元素{-1,0,1}的均匀分布;但是在为arm64编译并在iPhone 5s上运行时会产生{4294967295,0,1}吗?

最佳答案

arc4random_uniform返回一个无符号的int,-1会将您返回到最大的32位整数大小4294967295。

您需要先将arc4random_uniform(3)转换为int,然后才能对其进行-1转换。

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的b的非符号扩展提升为64位类型,从而强制将有符号整数(以有符号方式)提升为匹配。有了该更改,结果就是预期的-1。

stolen from the apple 64-Bit Transition Guide.

关于ios - arc4random_uniform()和arm64的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505745/

相关文章:

arm - ARM中的字节序转换

c++ - 交叉编译c++到iphone arm

objective-c - cocos2d 的一种有效方式的随机 BOOL

ios - 使用 Arc4random 从列表中获取随机图像

ios - arc4random_uniform 在 OSX 10.10.4 上的 Xcode 7.0 beta (7a176x) 中不可用

objective-c - XCode 不会将我的 iPhone 设置为事件方案

ios - 如何使用 Eureka 创建自定义内联行?

ios - Apple Mach -O Linker 命令失败

ios - 我怎样才能摆脱 "Update to recommended settings"警告?

linux - ARM交叉编译时如何选择要链接的静态库?