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

tcl 8.4.9版本中的expr命令仅将结果视为32位有符号整数,tcl,expr,Tcl,Expr,我正在运行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" } 如何克服这些问题?是否有其他命令执行算术运算?中列出的库的最低版

我正在运行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"
}
如何克服这些问题?是否有其他命令执行算术运算?

中列出的库的最低版本要求为8.4。所以你应该能够使用它,尽管更新到8.6会给你比使用大整数更多的奖励

使用交互式tclsh repl会话的示例:

% 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

相同的非负结果。

通常,修复方法是升级到支持的版本,在该版本中,所有问题都已修复。8.4在这方面很奇怪,8.3根本不适用于64个值,而8.5清除了很多。您可以尝试在运算符的参数周围使用wide函数,看看这是否有帮助。另一方面,该值在8.4中为负值,因为它使用带符号的64位数学…我观察到tcl很好地处理64位带符号整数,但许多地址都超出了这一点,因此我正在寻找处理64位无符号整数的方法。可能使用tcllib中的math::bignum?我认为它适用于这么旧的tcl版本。