Начальный курс программирования на языке Форт

         

ИСПОЛЬЗОВАНИЕ ЧИСЕЛ В ОПРЕДЕЛЕНИЯХ


Если в определении содержится число, например, : БОЛЬШЕ-НА-ДВАДЦАТЬ ( n - n+20) 20 + ;

то это число компилируется в словарь в двоичной форме точно также, как оно выглядит в стеке.

Двоичное значение числа зависит от системы счисления, которая существует в системе на момент компиляции данного определения. Например, при вводе HEX : БОЛЬШЕ-НА-ДВАДЦАТЬ ( n -- n+20) 14 + ; DECIMAL

словарное определение должно содержать шестнадцатиричное значение 14, что соответствует десятичному значению 20(16 + 4). Впредь слово НЕСКОЛЬКО-БОЛЬШЕ будет всегда добавлять к содержимому стека эквивалент десятичного числа 20, независимо от текущей системы счисления. В том случае, когда вы поместите слово HEX внутрь определения, основание системы счисления будет изменяться при выполнении данного определения. Например, если вы определяете: DECIMAL : ПРИМЕР HEX 20 . DECIMAL ;

то число компилируется как двоичный эквивалент десятичного числа 20, поскольку во время компиляции текущей была DECIMAL (десятичная) система счисления. Во время выполнения произойдет следующее: ПРИМЕР 14 ok

Наше число выдается в шестнадцатиричной системе.

Заметьте, что число, помещенное внутри некоторого определения, называется литералом. (В отличие от слов, присутствующих в этом определении, которые ссылаются на другие определения, значение числа заключено в самом числе.)

Ниже приводится перечень слов Форта, рассмотренных в настоящей главе. U. ( u -- ) Вывод числа одинарной длины без знака с одним пробелом после него.

U.R ( u ширина -- ) Вывод числа без знака. Число выровнено по правой границе поля заданной ширины.

U< ( u1 u2 -- ? ) Помещение на стек истины в том случае, если u1<u2. Оба аргумента рассматриваются как числа одинарной длины без знака.

Стековая нотация для форматирования чисел:

ВЫРАЖЕНИЕ СОСТОЯНИЕ СТЕКА ТИП АРГУМЕНТОВ <# ... #> ( d -- а u) или 32-разрядный без знака ( u 0 - а и) 16-разрядный без знака



<# ... ( |d| -- а u) 32-разрядный со знаком, n SIGN #> где |d| является абсолют- или мым значением d, a n - верхней ячейкой d ( |n| 0 -- а u) 16-разрядный со знаком, где |n| - абсолютное значение n


Операции над числами двойной длины:

D+ ( dl d2 -- d-сумма) Сложение двух 32-разрядных чисел.

D- ( dl d2 -- d-разность) Вычитание одного 32-разрядного числа ив другого (dl-d2).

DNEGATE ( d -- -d) Изменение знака 32-разрядного числа на противоположный.

DABS ( d1 -- |d|) Занесение в стек абсолютного значения 32-разрядного числа.

DMAX ( d1 d2 -- d-max) Занесение в стек максимального из двух 32-разрядных чисел.

DMIN ( d1 d2 -- d-min) Занесение в стек минимального из двух 32-разрядных чисел.

D= ( d1 d2 -- ?) Занесение в стек истины в случае равенства d1 и d2.

D0= ( d -- ?) Занесение в стек истины, если d равно нулю.

D< ( d1 d2 -- ?) Занесение в стек истины, если dl меньше d2.

DU< ( ud1 ud2 -- ?) Занесение в стек истины, если ud1 меньше ud2. Оба числа без знака.

D.R ( d ширина -- ) Вывод 32-разрядного числа со знаком. Число выравнивается справа внутри поля заданной ширины.

Смешанные операции:

UM* ( ul u2 -- ud) Перемножение двух 16-разрядных чисел. Все значения без знака. (В предыдущих версиях данная операция называлась U*)

UM/MOD ( ud u1 -- u2 u3) Деление 32-разрядного числа на 16-разрядное. В стек заносятся 16-разрядные остаток и частное ( честное в вершину). Частное округлено до ближайшего меньшего целого! Все значения без знака. (В предыдущих версиях данная операция называлась U/MOD).

M* ( n1 n2 -- d- Перемножение двух 16-разрядных чи- произведение) сел. Все знамени» со знаком.

М+ ( d n -- d-сумма) Сложение 32-разрядного и 16-раэрядного чисел. Результат 32-разрядный.

М/ ( d n -- n-частное) Деление 32-разрядного числа на 16-разрядное. Результат 16-разрядный. Все значения со знаком.

М*/ ( d n u -- d) Умножение 32-разрядного на 16-разрядное и деление промежуточного результата тройной длины на 16-разрядное число (d*n/u). Результат 32-разрядный.

Условные обозначения:

n, n1 ... - 16-разрядные числа со знаком; а - адрес; d, d1 ... - 32-разрядные числа со знаком; u, u1 ... - 16-разрядные числа без знака; с - значение символа в коде ASCII.


Содержание раздела