OberonCore
https://forum.oberoncore.ru/

Беззнаковые числовые типы
https://forum.oberoncore.ru/viewtopic.php?f=29&t=1249
Страница 1 из 1

Автор:  rv82 [ Среда, 12 Ноябрь, 2008 12:53 ]
Заголовок сообщения:  Беззнаковые числовые типы

Здравствуйте! Подскажите пожалуйста, как можно реализовать работу с беззнаковыми числами. Имеется бинарный файл, состоящий из двухбайтных беззнаковых чисел (тип Word в терминологии Делфи. Диапазон 0..65535). Нужно его прочитать. Как это сделать, не знаю. Думал читать побайтово, с последующим сдвигом влево, но номер не прошёл. Тип BYTE - знаковый. Использовать SHORTINT тоже нельзя, он тоже знаковый. Посему, использовать PROCEDURE (VAR rd: Reader) ReadSInt (OUT x: SHORTINT) из модуля Stores тоже нельзя. А как тогда выйти из положения? Подскажите пожалуйста! Очень нужно!

Автор:  Евгений Темиргалеев [ Среда, 12 Ноябрь, 2008 13:18 ]
Заголовок сообщения:  Re: Беззнаковые числовые типы

Поскольку беззнаковых типов нету, для их обработки нужно использовать знаковый большего размера, т.е. для word - INTEGER. Могу предложить такой вариант:
Код:
rd.ReadSInt(x);
y := ORD(BITS(x) * {0..15}); (* y := integer(x) and $0000FFFF *)
Расширение SHORTINT до INTEGER (integer(x)) делается автоматом для параметра BITS. А побитовые операции делаются через множества.

Автор:  AVC [ Среда, 12 Ноябрь, 2008 13:32 ]
Заголовок сообщения:  Re: Беззнаковые числовые типы

Другой сходный вариант - использовать свойства операции MOD:
Код:
   PROCEDURE Do* ;
      VAR h: SHORTINT; n: INTEGER;
   BEGIN
      h := -1;
      n := h MOD 10000H;
      Log.Int(n); Log.Ln;
   END Do;
Процедура Do напечатает 65535. Операция MOD в данном случае сводится к сдвигам или маскированию, так что потери эффективности нет.

Автор:  Trurl [ Среда, 12 Ноябрь, 2008 15:31 ]
Заголовок сообщения:  Re: Беззнаковые числовые типы

Еще один трюк:
Код:
VAR n:INTEGER;
      s:CHAR;
      b:SHORTCHAR;
....
  n := ORD(s);
  n := ORD(b);


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

Автор:  AVC [ Среда, 12 Ноябрь, 2008 17:24 ]
Заголовок сообщения:  Re: Беззнаковые числовые типы

Trurl писал(а):
Еще один трюк:
<...>
Это даже чуть эффективнее, поскольку даже маскирование не выполняется.
Спасибо, хороший приём.
Хотя (теоретически :) ) хороший однопроходный компилятор Оберона должен сгенерить тот же код и для
h MOD 10000H (используя delayed code emission).

Автор:  Info21 [ Среда, 12 Ноябрь, 2008 20:08 ]
Заголовок сообщения:  Re: Беззнаковые числовые типы

rv82 писал(а):
... Использовать SHORTINT тоже нельзя, он тоже знаковый. Посему, использовать PROCEDURE (VAR rd: Reader) ReadSInt (OUT x: SHORTINT) из модуля Stores тоже нельзя.

А какая разница, что он знаковый? Это всего лишь интерпретация набора битов, который один и тот же.
Всё зависит от того, что потом с ним делать.
Читаем в SHORTINT, и если окажется отрицательным, можно прибавить что-то вроде -MIN(SHORTINT).

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/