相同的 Int 在 Swift 中有不同的值,神秘的谜语

same Int has different values in Swift, mysterious riddle

使用此代码:

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

我得到:

rand = -1954814774 -1954814774 2340152522 2340152522

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

arc4random 生成一个无符号的 32 位整数。 Int 在你的机器上可能是 64 位的,所以你得到相同的数字并且它不会溢出。但是 %i%dsigned 32 位格式说明符。参见 here and here。这就是为什么当 arc4random returns 大于 2^32-1 的数字,也就是 Int32.max.

时,你得到一个负数的原因

例如生成2340152522时,在%i的位置得到-1954814774,因为:

Int32(bitPattern: 2340152522) == -1954814774

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