0

我正在运行 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"
}

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

4

1 回答 1

1

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

相同的非阴性结果。

于 2020-01-16T22:50:56.193 回答