% expr 0xffffffffff
1099511627775
%
%
% format %i 0xffffffffff
-1
% format %li 0xffffffffff
1099511627775
%
仔细观察上述步骤,expr能够对超过32个字节的数字进行操作,而不是特意告诉TCL解释器。
格式命令无法在此处进行操作。
这里format
命令能够在告诉解释器它很长(通过声明'l'
(el))之后进行操作。
expr
命令如何操作它。我使用的是TCL 8.5版。
答案 0 :(得分:4)
Tcl 8.5获得了对任意长度整数的支持(基于libtommath
库的修改代码),其工作方式如下:直到整数适合其平台原生大小,数学运算使用“plain”完成“整数,当解释器检测到操作的结果即将溢出平台的整数大小时,生成的Tcl值将由合成的任意大小的整数表示。这一切都是透明的。
在进一步阅读之前要理解的关键是,当Tcl将某个值解释为整数而不任何显式规范其实数类型时,结果整数将被签名。
现在,当您在交互式解释器中运行expr 0xffffffffff
时,Tcl shell需要显示运行expr
的结果,这意味着将其转换为一个字符串首先。由于这是一个默认转换(也就是说,你没有对它进行任何控制 1 ),它只需要你的任意长度整数并将其格式化 - 作为一个签名整数。
使用format
命令对显式转换为字符串时,后者根据匹配的格式字符串规范解释传递给它的值,所以如果你告诉它你有一个32位整数,format
将其解释为,如果你告诉它你有一个64位整数,就会发生同样的事情。显然,结果会有所不同。
1 没有操纵tcl_precision
全局变量,但这不适用于我们的情况。