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); Расширение SHORTINT до INTEGER (integer(x)) делается автоматом для параметра BITS. А побитовые операции делаются через множества.
y := ORD(BITS(x) * {0..15}); (* y := integer(x) and $0000FFFF *) |
Автор: | AVC [ Среда, 12 Ноябрь, 2008 13:32 ] |
Заголовок сообщения: | Re: Беззнаковые числовые типы |
Другой сходный вариант - использовать свойства операции MOD: Код: PROCEDURE Do* ; Процедура Do напечатает 65535. Операция MOD в данном случае сводится к сдвигам или маскированию, так что потери эффективности нет.
VAR h: SHORTINT; n: INTEGER; BEGIN h := -1; n := h MOD 10000H; Log.Int(n); Log.Ln; END Do; |
Автор: | 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/ |