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