我对Delphi Foundations一书中的以下代码有几个问题
S := Format('It is %d', [65]); //assigns it to 64
64是错字吗?
为什么
S := Format('%u', [-1]);
返回4294967295
?
我对Delphi Foundations一书中的以下代码有几个问题
S := Format('It is %d', [65]); //assigns it to 64
64是错字吗?
为什么S := Format('%u', [-1]);
返回4294967295
?
S := Format('It is %d', [65])
会产生'It is 65'
. 如果书上另有说法,那就错了。
S := Format('%u', [-1])
产生'4294967295'
,因为数字被格式化为无符号值。有符号与无符号-1
具有相同的位模式4294967295
(它们都是$FFFFFFFF
十六进制)。
(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) 在这种情况下,“外行人”只是“非技术人员”、“不是极客的人”等的同义词。