Положительные, отрицательные числа и числа без знака
Для представления чисел одинарной длины в Форте используются два байта, т.е. 16 битов памяти. Поэтому возможно представить числа от 0 до 65535 (2^16=65536), не так ли ? Но, разумеется, если нам не нужны отрицательные числа.
Попробуйте ввести с клавиатуры
65535 .
Результат получится такой:
-1 ok
Что произошло ? Очевидно, то, что Форт воспринимает число 65535 как отрицательное число. Теперь попробуйте
65534 .
и получите
-2 Ok
Это кажется еще более странным. А теперь введите
32768 .
Форт выдаст
-32768 ok
В то же время, если ввести
32767 .
мы получим
32767 ok
Ужасная путаница, неправда ли ? В действительности же форт работает с так называемыми числами со знаком и числами без знака. Все, что находится в диапазоне 32768 - 65535, Форт рассматривает как отрицательные числа, если вы не указываете, что они положительные. Попробуйте ввести
65535 U.
Результат
65535 ok
получится таким, каким он и должен быть. Если вы испытаете слово U. с другими числами, включая те, которые больше 32767, вы будете получать те же числа, что и ввели. Слово U. предназначено для печати чисел, не принимая во внимание знак числа, т.е. "чисел без знака". Имеются также другие операторы для выполнения арифметических действий с числами без знака, и мы будем работать с ними в гл. 4. Ну а теперь попробуйте ввести
-1 U.
в результате получится число 65535. Становится все хуже и хуже. А вот что происходит на самом деле. Если вы вводите 65535 или -1, Форт кладет в стек одно и то же число:
1111111111111111
В нем все 16 разрядов установлены в "1".
Числа 65534 и -2 вводятся в стек в виде
1111111111111110
и 65533 и -3 - как
1111111111111101
Поэтому, если числа больше 32767, Форт может рассматривать их и как отрицательные и как числа без знака, в зависимости от ваших указаний. Числа 0 - 32767 (от 0 до 11111111111111, с 15 единицами) воспринимаются как положительные. Если число со знаком, т.е. если его 16-й разряд равен 1, тогда число считается отрицательным, но это не совсем так, потому что оказывается, что числа "больше" 32767 (как числа без знака) менее "отрицательные".
Более понятно это станет из упражнений.
Принятое в Форте соглашение об использовании чисел со знаком называется арифметикой с дополнением по модулю два. Не вдаваясь в причины, укажем, что число в арифметике с дополнением по модулю два получается путем вычитания каждого разряда из 1, а затем добавлением ко всему числу 1. Образование числа с дополнением по модулю два попросту меняет его знак. Так, -10 является дополнением по модулю два от 10, а 10 - дополнением по модулю два от -10. Оказывается,что принятое соглашение упрощает работу ЦПУ при арифметических операциях. (В большинстве других языков также применяется целочисленная арифметика с дополнением до 2.) Вспомните, что слово NOT в Форт-83 эквивалентно вычитанию каждого разряда числа из 1, поэтому
10 NOT 1 + .
даст в результате -10. Стандартное слово NEGATE делает следующее: оно изменяет знак числа, вычисляя его дополнение по модулю два. Дополнение чисел и дополнительная арифметика подробно описаны в книге Липшуца (1982).