OberonCore https://forum.oberoncore.ru/ |
|
Невозможно -9223372036854775808 https://forum.oberoncore.ru/viewtopic.php?f=23&t=6617 |
Страница 1 из 1 |
Автор: | adimetrius [ Четверг, 21 Май, 2020 22:00 ] |
Заголовок сообщения: | Невозможно -9223372036854775808 |
Любопытная деталь: компилятор ББ считает число -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-летний код ради такой мелочи. |
Автор: | Comdiv [ Пятница, 22 Май, 2020 01:34 ] |
Заголовок сообщения: | Re: Невозможно -9223372036854775808 |
В КП нет одиночного минуса. Есть сложение и вычитание с неявным 0. Разница может показаться бессмысленной мелочью, но чему будет равен (- 1 DIV 2)? |
Автор: | adimetrius [ Пятница, 22 Май, 2020 11:28 ] |
Заголовок сообщения: | Re: Невозможно -9223372036854775808 |
Коллега, похоже, вы правы! SimpleExpr = ["+"|"-"] Term {AddOp Term}. Term = Factor {MulOp Factor}. Т.е. все-таки унарный минус есть, но он применяется к терму, в частном случае - к константе. А отрицательных чисел в тексте модуля с т.зр. Сообщения не бывает. Я этого не учел, поэтому мое решение некорректно. |
Автор: | Comdiv [ Пятница, 22 Май, 2020 17:10 ] |
Заголовок сообщения: | Re: Невозможно -9223372036854775808 |
Если уж очень хочется иметь возможность записать минимальное константное значение без применения арифметики, то лучше позволить использовать максимальное значение с зачётом единицы. Главное, чтобы конечное значение вписывалось в диапазон. Можно и обобщить. Ну и это не одиночный минус, а именно арифметика с неявным 0. Одиночный минус записывается отдельным синтаксическим выражением(усложнением) и понижает ошибкоустойчивость синтаксиса. Всё не критично, но не нужно. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |