OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 09:11

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Невозможно -9223372036854775808
СообщениеДобавлено: Четверг, 21 Май, 2020 22:00 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Любопытная деталь: компилятор ББ считает число -9223372036854775808 в тексте программы ошибкой, хотя оно входит в диапазон LONGINT согласно Сообщению о языке. Вместо этого можно писать MIN(LONGINT) или -9223372036854775807 - 1.

Связано с тем, что унарный минус расценивается как операция, за которой следует число; а 9223372036854775808 не входит в диапазон LONGINT, и поэтому выдается ошибка number too large.

Поправить несложно:

в DevCPS:
(* global *)
VAR unaryMinus*: BOOLEAN;
(* в PROCEDURE Number после строчки *)
ELSIF intval < 9223372036854775808.0E0 - realval THEN numtyp := int64 (* 2^63 *)
(* добавить *)
ELSIF unaryMinus & (intval = 9223372036854775808.0E0 - realval) THEN numtyp := int64
(* и в конце *)
IF unaryMinus THEN intval := -intval; realval := -realval END
END Number;

DevCPP:
(* в PROCEDURE SimpleExpression *)
IF sym = minus THEN DevCPS.unaryMinus := TRUE; DevCPS.Get(sym); DevCPS.unaryMinus := FALSE; Term(x);
IF (x.class # Nconst) OR ~(x.typ.form IN {Int8, Int16, Int32, Int64, Real32, Real64}) THEN
DevCPB.MOp(minus, x)
END

Но, может, и не стоит трогать 20-летний код ради такой мелочи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Невозможно -9223372036854775808
СообщениеДобавлено: Пятница, 22 Май, 2020 01:34 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
В КП нет одиночного минуса. Есть сложение и вычитание с неявным 0. Разница может показаться бессмысленной мелочью, но чему будет равен (- 1 DIV 2)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Невозможно -9223372036854775808
СообщениеДобавлено: Пятница, 22 Май, 2020 11:28 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Коллега, похоже, вы правы!

SimpleExpr = ["+"|"-"] Term {AddOp Term}.
Term = Factor {MulOp Factor}.

Т.е. все-таки унарный минус есть, но он применяется к терму, в частном случае - к константе. А отрицательных чисел в тексте модуля с т.зр. Сообщения не бывает. Я этого не учел, поэтому мое решение некорректно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Невозможно -9223372036854775808
СообщениеДобавлено: Пятница, 22 Май, 2020 17:10 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Если уж очень хочется иметь возможность записать минимальное константное значение без применения арифметики, то лучше позволить использовать максимальное значение с зачётом единицы. Главное, чтобы конечное значение вписывалось в диапазон. Можно и обобщить.

Ну и это не одиночный минус, а именно арифметика с неявным 0. Одиночный минус записывается отдельным синтаксическим выражением(усложнением) и понижает ошибкоустойчивость синтаксиса. Всё не критично, но не нужно.


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

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


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

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


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

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