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

标签 swift uint

如标题所述,lldb 将 UInt.max 的值报告为 -1UInt,这似乎非常不合逻辑。考虑到 let uint: UInt = -1 甚至都无法编译,这怎么可能呢?我看不出有任何方法可以在运行时使 UInt 为负值,因为如果给定负值,初始化程序将崩溃。我想知道 UInt 的实际最大值。

最佳答案

-1Int值和UInt.maxUInt值在内存。

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

let i = Int(bitPattern: UInt.max)  // i == -1

反方向:

if UInt(bitPattern: Int(-1)) == UInt.max {
    print("same")
}

输出:

same

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

如果这样做,您会看到同样的问题:

print(String(format: "%d", UInt.max))  // prints "-1"

这并不意味着 UInt.max -1,只是两者在内存中具有相同的表示。


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

print(UInt.max)

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

lldb 中:

(lldb) p String(UInt.max)
(String) $R0 = "18446744073709551615"
(lldb) 

关于Swift:为什么 UInt.max == -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369708/

相关文章:

java - 在 Java 中解码 Base64 百分比编码的图像字符串

swift - Swift 中 UInt8[4] 到 Int

Java 到 C# 的转换 - int uint 类型

hex - 将Uint颜色转换为KMLB颜色的argb十六进制

c++ - 使用 uintX_t 性能

ios - 动画应用程序的按钮

ios - 无法删除协议(protocol)扩展内的NotificationCenter观察者

ios - 如何使图像旋转(动画)

java - iOS 和 Android AES 加密(Java 中没有 UINT)

ios - Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?