0

我对Delphi Foundations一书中的以下代码有几个问题

S := Format('It is %d', [65]); //assigns it to 64
  1. 64是错字吗?

  2. 为什么S := Format('%u', [-1]);返回4294967295

4

2 回答 2

3
  1. S := Format('It is %d', [65])会产生'It is 65'. 如果书上另有说法,那就错了。

  2. S := Format('%u', [-1])产生'4294967295',因为数字被格式化为无符号值。有符号与无符号-1具有相同的位模式4294967295(它们都是$FFFFFFFF十六进制)。

  3. 外行人

于 2013-10-27T17:10:27.920 回答
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) 在这种情况下,“外行人”只是“非技术人员”、“不是极客的人”等的同义词。

于 2013-10-27T18:45:48.927 回答