TCL 8.4.9 版本中的 expr 命令仅将结果视为 32 位有符号整数



我正在运行Tcl 8.4.9。我正在处理 64 位地址,需要对 64 位地址执行一些算术运算。 我使用了expr命令,但它返回了负结果。我不想升级Tcl版本还有其他选择吗?

set addr 0xffff00001000000
set offset 0x01
set newaddr [expr {$addr + $offset}]
if {$newaddr < 0} {
puts "Less than ZERO"
}

如何克服这些问题 还有其他命令可以进行算术运算吗?

来自 tcllib 的 math::bignum 库被列为最低版本要求为 8.4。所以你应该能够使用它(尽管更新到 8.6 比能够使用大整数给你更多的奖励(。

示例(使用交互式tclshrepl 会话(:

% package require math::bignum
3.1.1
% set addr [::math::bignum::fromstr 0xffff00001000000]
bignum 0 0 256 61440 4095
% set offset [::math::bignum::fromstr 0x01]
bignum 0 1
% set newaddr [::math::bignum::add $addr $offset]
bignum 0 1 256 61440 4095
% puts [::math::bignum::tostr $newaddr 16]
ffff00001000001

与 tcl 8.6 原生数学相比:

% set addr 0xffff00001000000
0xffff00001000000
% set offset 0x01
0x01
% set newaddr [expr {$addr + $offset}]
1152903912437579777
% puts [format %x $newaddr]
ffff00001000001

相同的非阴性结果。

最新更新