Дополнительный код
Дополнительный код (англ. two’s complement) используется в Каллисто для машинного представления целых чисел со знаком (англ. signed integer). Это та же система кодирования чисел «дополнение до двух», что используется в микроконтроллере ЭКВМ и всех персональных компьютерах с процессорами фирмы «Интел».
Старший бит определяет знак числа. Если старший бит равен нулю, число считается положительным, а его абсолютное значение (модуль) совпадает с тем, как записываются беззнаковые целые числа (англ. unsigned integer).
Если старший бит равен единице, число считается отрицательным. Абсолютное значение данного числа можно узнать, изменив все его биты и прибавив к результату единицу.
Целые числа в стеке
Целые 32-битные числа представляются в десятичном стеке, как целые числа со знаком (англ. signed integer) в дополнительном коде. Целое число, все 32 бита которого установлены, представляется в стеке числом -1.
Стек данных содержит десятичные числа. При корректных расчётах этим можно пренебречь, но при арифметическом переполнении результат отличается от результата при переполнении двоичных машин.
32-битные числа (как со знаком, так и без знака) могут безошибочно записываться из стека в десятичные регистры и переменные с помощью слов ! и TO, а также считываться из них обратно. Для считывания в стек 32-битного целого из десятичного регистра служит слово @.
Целые числа в двоичной ячейке памяти
Двоичная ячейка памяти состоит из двух байт и хранит 16-битные двоичные целые числа. Для хранения в такой ячейке чисел со знаком Каллисто использует дополнительный код. Старший байт числа хранится в первом байте ячейки, при этом его старший бит является знаковым — для положительных чисел значение первого байта меняется от 0 до 127, для отрицательных от 128 до 255.
Таблица показывает, как некоторые целые числа со знаком записываются в двух байтах ячейки памяти Каллисто:
Число | Первый байт ячейки | Второй байт ячейки |
---|---|---|
0 | 0 | 0 |
+1 | 0 | 1 |
+2 | 0 | 2 |
+255 | 0 | 255 |
+256 | 1 | 0 |
+257 | 1 | 1 |
+258 | 1 | 2 |
+32766 | 127 | 254 |
+32767 | 127 | 255 |
-1 | 255 | 255 |
-2 | 255 | 254 |
-255 | 255 | 1 |
-256 | 255 | 0 |
-257 | 254 | 255 |
-258 | 254 | 254 |
-32767 | 128 | 1 |
-32768 | 128 | 0 |