Swift 为什么UInt.max==-1

Swift 为什么UInt.max==-1,swift,uint,Swift,Uint,正如标题所述,lldb将UInt.max的值报告为-1的UInt,这似乎非常不合逻辑。考虑到let uint:uint=-1甚至不编译,这怎么可能呢?我看不出在运行时有任何方法使UInt为负值,因为如果给定负值,初始化器将崩溃。我想知道UInt的实际最大值。这听起来像是在解释Two的补码和无符号表示下的文字值之间转换的例子 在无符号世界中,二进制数只是一个二进制数,因此1的位数越多,数字越大,因为不需要对符号进行编码。为了表示最大数量的有符号值,如果最极端的位不是1,则两个补码编码方案将正数编码

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

这听起来像是在解释Two的补码和无符号表示下的文字值之间转换的例子

在无符号世界中,二进制数只是一个二进制数,因此1的位数越多,数字越大,因为不需要对符号进行编码。为了表示最大数量的有符号值,如果最极端的位不是1,则两个补码编码方案将正数编码为正常值。如果最极端位为1,则按照中的说明重新解释这些位


如维基百科所示,
-1
的两个补码表示将所有位设置为1,或最大无符号值。
-1
Int
值和
UInt
UInt.max
在内存中具有相同的位表示

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

let i = Int(bitPattern: UInt.max)  // i == -1
print(String(format: "%d", UInt.max))  // prints "-1"
相反的方向:

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

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

如果执行以下操作,则可以看到相同的问题:

let i = Int(bitPattern: UInt.max)  // i == -1
print(String(format: "%d", UInt.max))  // prints "-1"
这并不意味着
UInt.max
-1
,只是两者在内存中具有相同的表示形式


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

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

lldb中

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

您从
UInt.max
-1
的准确程度如何?如何显示值?
-1
Int
值和
UInt
UInt.max
在内存中具有相同的位表示。您可以看到,如果执行
let i=Int(bitPattern:UInt.max)
@KurtRevis,我的点是UInt.max是-1。如果调试器中的
p UInt.max
得到-1。那么这是调试器中的一个错误:调试器必须获取
UInt
的位,将其错误地解释为有符号值,并显示该有符号值。根据游乐场的情况,它们也有相同的错误。@PatrickGoley,调试器正在将
UInt.max
显示为带符号的
Int
。它们在内存中具有相同的位表示。如果执行
打印(字符串(格式:'%ld',UInt.max))
,也可以看到它。这并不意味着
UInt.max
-1
,只是两者在内存中具有相同的表示形式。