TCL:为什么expr操纵大于0xffffffff的数字而不告诉解释器它是多长?

时间:2013-09-19 09:19:27

标签: tcl

STEP-1

% expr 0xffffffffff
1099511627775
%
%

STEP-2

% format %i 0xffffffffff
-1

STEP-3

% format %li 0xffffffffff
1099511627775
%

STEP-1

仔细观察上述步骤,expr能够对超过32个字节的数字进行操作,而不是特意告诉TCL解释器。

STEP-2

格式命令无法在此处进行操作。

STEP-3

这里format命令能够在告诉解释器它很长(通过声明'l'(el))之后进行操作。

expr命令如何操作它。我使用的是TCL 8.5版。

1 个答案:

答案 0 :(得分:4)

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

在进一步阅读之前要理解的关键是,当Tcl将某个值解释为整数而不任何显式规范其实数类型时,结果整数将被签名。

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

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


1 没有操纵tcl_precision全局变量,但这不适用于我们的情况。