正如标题状态,LLDB报告的值UInt.max是一个UInt的-1,这似乎不合逻辑的高度.考虑到let uint: UInt = -1甚至没有编译,这怎么可能呢?我没有看到任何方法在运行时具有负值的UInt,因为如果给定负值,初始化程序将崩溃.我想知道UInt的实际最大值.
所述Int的值-1和UInt值UInt.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)
输出:
Run Code Online (Sandbox Code Playgroud)same
调试器错误地显示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)
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |