Команда expr в версии tcl 8.4.9 обрабатывает результат только как 32-разрядное целое число со знаком - PullRequest
0 голосов
/ 15 января 2020

Я использую Tcl 8.4.9. Я имею дело с 64-битным адресом и мне нужно выполнить некоторые арифметические c операции над 64-битным адресом. Я использовал команду expr, но она возвращает отрицательный результат. Я не хочу обновлять версию Tcl. Есть ли другая альтернатива для нее ??

set addr 0xffff00001000000
set offset 0x01

set newaddr [expr {$addr + $offset}]

if {$newaddr < 0} {
    puts "Less than ZERO"
}

Как преодолеть такие проблемы, есть ли какая-либо другая команда для выполнения арифметических операций c?

1 Ответ

1 голос
/ 17 января 2020

Библиотека math :: bignum из tcllib указана как имеющая минимальное требование к версии 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

Тот же неотрицательный результат.

...