netlib.narod.ru< Назад | Оглавление | Далее >

1.6. Логические операции

В языке Форт имеется только один тип значений — 16-разрядные двоичные числа, которые, как мы видели, рассматриваются в зависимости от ситуации как целые числа со знаком или как адреса и т. д. Точно так же подходят и к проблеме представления логических значений ИСТИНА и ЛОЖЬ: число 0, в двоичном представлении которого все разряды нули, представляет значение ЛОЖЬ, а любое другое 16-разрядное значение понимается как ИСТИНА. Вместе с тем стандартные слова, которые должны возвращать в качетве результата логическое значение, из всех возможных представлений значения ИСТИНА используют только одно: число -1 (или, что то же самое, 65535), в двоичном представлении которого все разряды единицы. Такое соглашение связано с тем, что традиционные логические операции конъюнкции, дизъюнкции и отрицания выполняются в Форте поразрядно над всеми шестнадцатью разрядами операндов:

  AND   A,B ---> A   B   логическое И
  OR    A,B ---> A   B   логическое ИЛИ
  XOR   A,B ---> A   B   исключающее ИЛИ
  NOT     A --->  ^ A    логическое НЕ

Как и в предыдущих случаях, эти операции не являются независимыми: операция отрицания (поразрядное инвертирование) легко выражается через исключающее ИЛИ (поразрядное сложение по модулю два):

  : NOT ( A --> ^A )  -1 XOR ;

Нетрудно увидеть, что для принятого в Форте стандартного представления значений ИСТИНА и ЛОЖЬ все эти слова работают, как обычные логические операции.

Логические значения возникают в операциях сравнения, которые входят в обязательный набор слов и имеют общепринятую программистскую мнемонику:

  <  A,B ---> A < B   меньше
  =  A,B ---> A = B   равно
  >  A,B ---> A > B   больше

Эти операции снимают со стека два врехних значения, сравнивают их как числа со знаком (операция «равно» выполняет поразрядное сравнение) и возвращают результат сравнения как значение ИСТИНА или ЛОЖЬ в описанном выше стандартном представлении. Из-за стремления к минимизации обязательного набора операций в него не включены слова для операций смешанного сравнения, поскольку их легко выразить через уже имеющиеся:

  : <=  ( A,B ---> A <= B )  SWAP < NOT ;
  : >=  ( A,B ---> A >= B )  SWAP > NOT ;
  : <>  ( A,B ---> A <> B )  = NOT ;

Для сравнения 16-разрядных чисел без знака имеется слово U< A,B --> A < B. Эта операция обычно используется для сравнения адресов, которые лежат в диапазоне от 0 до 65535. Буква U (от UNSIGNED — беззнаковый) в ее мнемонике говорит о том, что операнды рассматриваются как числа без знака.

Ввиду частого использования и возможности непосредственной реализации на многих существующих ЭВМ в обязательный набор слов включены одноместные операции сравнения с нулем:

  0<   A ---> A < 0
  0=   A ---> A = 0
  0>   A ---> A > 0

При этом слово 0= можно использовать вместо NOT как операцию логического отрицания, и в отличие от NOT оно будет правильно работать при любых представлениях логического значения ИСТИНА.

Описанные выше двухместные операции сравнения естественным образом выражаются через сравнения с нулем:

  : <  ( A,B ---> A < B )  - 0< ;
  : =  ( A,B ---> A = B )  - 0= ;
  : >  ( A,B ---> A > B )  - 0> ;

Стандартное расширение двойных чисел имеет аналогичные слова для сравнения 32-разрядных значений:

  D0=     AA ---> AA = 0
  D<   AA,BB ---> AA < BB
  D=   AA,BB ---> AA = BB
  DU<  AA,BB ---> AA < BB

Слова D< и DU< различаются тем, что первое рассматривает свои операнды как числа со знаком, а второе — как числа без знака. Для слов D0= и D= такое различие несущественно, их, например, можно определить так:

  : D0=  ( AA ---> AA = 0 )   OR 0= ;
  : D=   ( AA,BB ---> AA = BB )  D- D0= ;

Слово OR (логическое ИЛИ) в определении слова D0= логически складывает старшую и младшую половины исходного 32-разрядного значения. Нулевой результат будет получен тогда и только тогда, когда исходное значение было нулевым. Следующее слово 0= преобразует этот результат к логическому значению в стандартном представлении. Исполнение слова D= состоит в вычислении разности его операндов в сравнении этой разности с нулем.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz