0

步骤1

% expr 0xffffffffff
1099511627775
%
%

第2步

% format %i 0xffffffffff
-1

第 3 步

% format %li 0xffffffffff
1099511627775
%

步骤1

仔细观察上面的步骤 expr 能够在不告诉 TCL 解释器的情况下处理超过 32 个字节的数字。

第2步

此处格式命令无法操作相同的 .

第 3 步

这里format的命令可以在告诉解释器它是一个 long (通过声明'l'(el)) 之后进行操作。

命令如何expr操作它。我正在使用 TCL 8.5 版。

4

1 回答 1

4

Tcl 8.5 获得了对任意长度整数的支持(基于libtommath库的修改代码),其工作方式如下:直到您的整数适合其平台原生大小,数学运算使用“普通”整数完成,并且当解释器检测到操作的结果即将溢出平台的整数大小,生成的 Tcl 值将由合成的任意大小的整数表示。这一切都是透明地发生的。

在进一步阅读之前要理解的关键是,当 Tcl 将一个值解释为一个没有任何明确说明其实际类型的整数时,结果整数将是有符号的。

现在,当您expr 0xffffffffff交互式解释器中运行时,Tcl shell 需要向您显示运行的结果expr,这意味着首先将其转换为字符串。由于这是一个默认转换(也就是说,您无法控制它1),它只需要您的任意长度整数并将其格式化 - 作为有符号整数。

当您使用命令显式转换为字符串format时,后者会根据匹配的格式字符串规范解释传递给它的值,因此如果您告诉它您有一个 32 位整数,format则将其解释为,如果您告诉如果你有一个 64 位整数,同样的事情也会发生。显然,结果会有所不同。


1缺少操作tcl_precision全局变量,但这不适用于我们的案例。

于 2013-09-19T10:31:46.390 回答