OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 20 Сентябрь, 2020 14:34

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 17:26 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Tel-Aviv
Есть два варианта процедур, возвращающих младшее слово от двойного слова. Но одна из них сбоит, а другая - нет, хотя разницы не вижу.
Код:
(*   (* рабочая версия *)
   PROCEDURE IntLow (a: LONGINT): INTEGER;
      VAR x: LONGINT;
   BEGIN
      x := a MOD 100000000L;
      RETURN SHORT(x)
   END IntLow;*)

   (* НЕрабочая версия *)
   PROCEDURE IntLow (a: LONGINT): INTEGER;
   BEGIN
      RETURN SHORT(a MOD 100000000L)
   END IntLow;

   PROCEDURE Test*;
      VAR y, z: LONGINT; x: INTEGER;
   BEGIN
      (* TEST PASSED *)
      z := 7FFFFFFF7FFFFFFFL; (* MAX(LONGINT) - MAX(INTEGER) - 1 *)
      x := IntLow(z);
      
      (* TEST FAILED *)
      z := 7FFFFFFF80000000L; (* MAX(LONGINT) - MAX(INTEGER) *)
      x := IntLow(z);
   END Test;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 17:56 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3191
Откуда: Астрахань
Дык может быть дело как раз в присваивании?
Код:
SHORT(a MOD 100000000L)

не эквивалентно ?
Код:
x:= a MOD 100000000L;
SHORT(x)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 18:04 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Tel-Aviv
Эквивалентны они с теоретической стороны, а на практике, как видно, не эквивалентны.
Возможно, где-то отсутствуют требуемые проверки. Я что-то не хочу лезть в код ББ для выяснения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 18:08 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Такое ощущение, что RETURN сразу задаёт диапазон значений в соответствии с типом, возвращаемый процедурой (INTEGER). Тогда SHORT(подвыражение) фактически уже принимает аргумент INTEGER.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 18:26 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1098
Откуда: Киев
Вообще, выпадать они должны в обоих случаях, поскольку результатом SHORT(number) должен быть тождество number, что для 80000000L невозможно (это больше чем MAX(INTEGER)). То, что первый вариант работает и возвращает отрицательное число, это лишь особенность реализации, на которую уповать не стоит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 18:53 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
В таком случае нужно реализовывать её через SYSTEM и ассемблеровский код.
Что-то вроде POP EAX; POP EAX; RET; $58 $58 $C3


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 20:27 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3191
Откуда: Астрахань
Роман М. писал(а):
Эквивалентны они с теоретической стороны, а на практике, как видно, не эквивалентны.
Возможно, где-то отсутствуют требуемые проверки. Я что-то не хочу лезть в код ББ для выяснения.

Скорее всего дело в размерах промежуточных переменных. В присваивании вы явно задаете тип промежуточной переменной как длинный. А неявно, видимо, размер равен обычному целому.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 20:44 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
В арифметических операциях размер устанавливает тип с большим диапазоном. INT + LONGINT = LONGINT


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 21:37 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Любопытен "заголовок" трапа:
undefined real result (B9A3, 37E)
Такое впечатление, что в операции 7FFFFFFF80000000H MOD 100000000L как-то используется плавающая арифметика.
Обратите внимание на "экспоненту" числа 7FFFFFFF80000000H.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовая арифметика
СообщениеДобавлено: Воскресенье, 21 Март, 2010 22:02 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8364
Откуда: Троицк, Москва
AVC писал(а):
Любопытен "заголовок" трапа:
undefined real result (B9A3, 37E)
Такое впечатление, что в операции 7FFFFFFF80000000H MOD 100000000L как-то используется плавающая арифметика.
Так оно и есть.


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

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


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

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


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

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