Swift:为什么UInt.max == -1

Pat*_*ley 3 uint swift

正如标题状态,LLDB报告的值UInt.max是一个UInt-1,这似乎不合逻辑的高度.考虑到let uint: UInt = -1甚至没有编译,这怎么可能呢?我没有看到任何方法在运行时具有负值的UInt,因为如果给定负值,初始化程序将崩溃.我想知道UInt的实际最大值.

vac*_*ama 5

所述Int的值-1UIntUInt.max在存储器中具有相同的位表示.

你可以看到,如果你这样做:

let i = Int(bitPattern: UInt.max)  // i == -1
Run Code Online (Sandbox Code Playgroud)

并在相反的方向:

if UInt(bitPattern: Int(-1)) == UInt.max {
    print("same")
}
Run Code Online (Sandbox Code Playgroud)

输出:

same
Run Code Online (Sandbox Code Playgroud)

调试器错误地显示UInt.max为已签名Int.它们在内存中具有相同的位表示(0xffffffffffffffff在诸如iPhone 6的64位系统和0xffffffff诸如iPhone 5的32位系统上),并且调试器显然选择将该值显示为Int.

如果你这样做,你可以看到同样的问题:

print(String(format: "%d", UInt.max))  // prints "-1"
Run Code Online (Sandbox Code Playgroud)

这并不意味着UInt.max -1,只是两者在存储相同的表示.


要查看最大值UInt,请在应用程序或Swift Playground中执行以下操作:

print(UInt.max)
Run Code Online (Sandbox Code Playgroud)

这将18446744073709551615在64位系统(如Macintosh或iPhone 6)和429496729532位系统(如iPhone 5)上打印.

lldb:

(lldb) p String(UInt.max)
(String) $R0 = "18446744073709551615"
(lldb) 
Run Code Online (Sandbox Code Playgroud)