Я думаю, вы можете быть немного смущены. Tcl 8.5 внутренне использует свою собственную арифметическую библиотеку произвольной точности (вилка libtommath), и она всегда должна вести себя так, как если бы целые были бесконечной ширины; фактическое представление обменивается взад и вперед между C long
, long long
и реальным типом произвольной точности по мере необходимости (хорошо, потому что использование родных числовых типов намного быстрее). Вы никогда не сможете писать сценарий, который соблюдает разницу, отличную от использования явных «отливок» функций Tcl int()
и wide()
.
Было гораздо более вероятно, что вы заметите проблему, которую вы описываете при использовании Tcl 8.4 (или раньше), где не было встроенной арифметической поддержки произвольной точности, и вам пришлось использовать пакет mpexpr.
Что касается того, как все работает, это в основном связано с тем, что значения в Tcl не должны быть представлены как системные целые числа; существует много других возможных представлений. Например, можно использовать long long
, а это 64-битное целое число в обычных 32-битных системах. Для более крупных типов представление обычно представляет собой последовательность «цифр», где каждая «цифра» находится в диапазоне 0-255; арифметические операции затем следуют общепринятым правилам для длительного сложения, длительного умножения и т. д., так же как и в школах. За исключением более десяти цифр для рассмотрения. (Действительно, они могут использовать C unsigned short
вместо unsigned char
для каждой цифры, давая диапазон 0-65535.) Существует довольно много специализированных алгоритмов, которые позволяют вам выполнять более сложные операции довольно быстро; Я дам вам ваши собственные литературные поиски ...