S := Format('It is %d', [65]); //assigns it to 64
64这是一个错字吗?
为什么S := Format('%u', [-1]);
会返回4294967295
?
答案 0 :(得分:3)
S := Format('It is %d', [65])
将生成'It is 65'
。如果这本书说不然,那就错了。
S := Format('%u', [-1])
生成'4294967295'
,因为该数字的格式为无符号值。签名-1
与无符号4294967295
具有相同的位模式(十六进制中均为$FFFFFFFF
)。
答案 1 :(得分:2)
(1)错字 - 请参阅http://delphifoundations.com/errata/以了解更多(如果您自己发现任何其他人,我将非常感谢您的反馈)。
(2)我在书中说的原因是:
如果传递了有符号整数,则只是强制转换为无符号整数 整数。给定内部表示有符号整数的方式, 这不仅仅是剥夺一个外行人的标志 视图。例如,
Format('%u', [-1])
返回'4294967295',而不是'1'。如果只是 剥离标志是你想要的,然后将值传递给 首先Abs
标准函数:Format('%u', [Abs(-1)])
。
因此,采用Integer / Int32和Cardinal / UInt32:这两种类型的实例需要32位内存。但是在Integer / Int32的情况下,其中一个位用于记录符号(加号或减号?),而使用Cardinal / UInt32时,没有记录的符号;相反,相同的位用于表示比Integer / Int32可以表示的数字大得多的数字。因此,Int32(-1)的内部表示恰好与UInt32(4294967295)的内部表示相同。
(3)在这种情况下,“外行人”只是“非技术人员”,“不是极客”的同义词等的同义词。