gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:06:10 28 4
gpt4 key购买 nike

给出以下代码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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com