Swift 相同的整数在快速、神秘的谜语中有不同的值

Swift 相同的整数在快速、神秘的谜语中有不同的值,swift,random,integer,nslog,Swift,Random,Integer,Nslog,使用此代码: let rand : Int = Int(arc4random()) NSLog("rand = %d %i %@ \(rand)",rand,rand,String(rand)) 我得到: rand = -1954814774 -1954814774 2340152522 2340152522 为什么所有4个值都不相同?arc4random生成一个无符号的32位int。int在您的计算机上可能是64位的,因此您得到的数字相同,并且不会溢出。但是%i和%d是

使用此代码:

let rand : Int = Int(arc4random())
NSLog("rand = %d %i %@ \(rand)",rand,rand,String(rand))
我得到:

rand = -1954814774 -1954814774 2340152522 2340152522

为什么所有4个值都不相同?

arc4random
生成一个无符号的32位int。
int
在您的计算机上可能是64位的,因此您得到的数字相同,并且不会溢出。但是
%i
%d
是有符号的32位格式说明符。见和。这就是为什么当
arc4random
返回一个大于2^32-1的数字时会得到一个负数,也就是
Int32.max

例如,当生成2340152522时,您在
%i
位置获得
-1954814774
,因为:

Int32(bitPattern: 2340152522) == -1954814774

另一方面,将
Int
转换为
String
不会改变数字
Int
是一个有符号的64位整数。

可能链接到func arc4random()->UInt32,但为什么?可能它与有符号与无符号有关?Int&Double是有符号的,字符串解释不符合Int是有符号整数值类型。“在32位平台上,Int的大小与Int32相同,在64位平台上,Int的大小与Int64相同。”因此可能有32/64位的链接,但我仍然不明白rand的值是什么,这是有意义的,谢谢!我明白我不应该使用%I和%d。使用Int(arc4random())安全吗?还是使用32位Int更好?@Gogo123您应该使用
Int.random(in:0…10)