OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 18 Июнь, 2025 01:27

Часовой пояс: UTC + 3 часа




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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Беззнаковые числовые типы
СообщениеДобавлено: Среда, 12 Ноябрь, 2008 13:18 
Модератор
Аватара пользователя

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


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Другой сходный вариант - использовать свойства операции 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 в данном случае сводится к сдвигам или маскированию, так что потери эффективности нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Беззнаковые числовые типы
СообщениеДобавлено: Среда, 12 Ноябрь, 2008 15:31 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1437
Еще один трюк:
Код:
VAR n:INTEGER;
      s:CHAR;
      b:SHORTCHAR;
....
  n := ORD(s);
  n := ORD(b);


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


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

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


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
rv82 писал(а):
... Использовать SHORTINT тоже нельзя, он тоже знаковый. Посему, использовать PROCEDURE (VAR rd: Reader) ReadSInt (OUT x: SHORTINT) из модуля Stores тоже нельзя.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB