相同的 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
和 %d
是 signed 32 位格式说明符。参见 here and here。这就是为什么当 arc4random
returns 大于 2^32-1 的数字,也就是 Int32.max
.
时,你得到一个负数的原因
例如生成2340152522时,在%i
的位置得到-1954814774
,因为:
Int32(bitPattern: 2340152522) == -1954814774
另一方面,将 Int
转换为 String
不会更改数字。 Int
是一个带符号的 64 位整数。
使用此代码:
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
和 %d
是 signed 32 位格式说明符。参见 here and here。这就是为什么当 arc4random
returns 大于 2^32-1 的数字,也就是 Int32.max
.
例如生成2340152522时,在%i
的位置得到-1954814774
,因为:
Int32(bitPattern: 2340152522) == -1954814774
另一方面,将 Int
转换为 String
不会更改数字。 Int
是一个带符号的 64 位整数。