OberonCore https://forum.oberoncore.ru/ |
|
"Понижение" типа константы - ошибка? https://forum.oberoncore.ru/viewtopic.php?f=131&t=2854 |
Страница 1 из 1 |
Автор: | Евгений Темиргалеев [ Пятница, 17 Сентябрь, 2010 19:16 ] |
Заголовок сообщения: | "Понижение" типа константы - ошибка? |
Напоролся на ошибку из-за следующего нюанса: - явное приведение к LONGINT делает константу соотв. типа - ожидал, что константа, вычисляемая с участием LONGINT-константы тоже будет LONGINT. Однако, если результат влезает в INTEGER, компилятор берёт его. Код: MODULE Test_const_type; IMPORT Log := StdLog; PROCEDURE Do*; CONST c1 = LONG(2); c2 = c1 * 1024; c3 = LONG(c1 * 1024); VAR a: INTEGER; x: LONGINT; BEGIN a := MAX(INTEGER); x := c1 * a; Log.Int(x); Log.Ln; x := c2 * a; Log.Int(x); Log.Ln; x := c3 * a; Log.Int(x); Log.Ln END Do; END Test_const_type. ^Q Test_const_type.Do Log писал(а): 4294967294
-2048 4398046509056 |
Автор: | Александр Ильин [ Пятница, 24 Сентябрь, 2010 14:37 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
В XDS не смог воспроизвести: компилятор вылетает с ошибкой при попытке скомпилировать строку LONG (constant expression). http://www.excelsior-usa.com/forum/inde ... pic=1950.0 |
Автор: | Борис Рюмшин [ Пятница, 24 Сентябрь, 2010 16:04 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
Фича! Однозначно фича! Можно, кстати, глянуть, что там на самом деле компилятор вытворяет (если у кого времени много). Тогда будет точно ясно что это. |
Автор: | Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 16:18 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
Меня больше интересует трактовка в определении языка. Цитата: 5. Constant Declarations И я понимаю его как "constant expression" эквивалентна expression, который считает компилятор. А эквивалентность означает, что результаты операций должны быть такие же как были бы для переменных при выполнении кода. Т.е. LONGINT.... A constant expression is an expression that can be evaluated by a mere textual scan without actually executing the program. Its operands are constants (Ch.8) or predeclared functions (Ch.10.3) that can be evaluated at compile time... Цитата: operator first operand second operand result type Склоняюсь к мнению, что это ошибка.
+ - * DIV MOD <= INTEGER <= INTEGER INTEGER integer type integer type LONGINT |
Автор: | Info21 [ Пятница, 24 Сентябрь, 2010 17:11 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
Евгений Темиргалеев писал(а): Меня больше интересует трактовка в определении языка. Сообщение о языке Компонентный Паскаль писал(а): 3. Словарь и изображение
... Типом целой константы является INTEGER, если значение константы принадлежит диапазону значений типа INTEGER ... |
Автор: | Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 18:23 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
Info21 писал(а): Сообщение о языке Компонентный Паскаль писал(а): 3. Словарь и изображение ... Типом целой константы является INTEGER, если значение константы принадлежит диапазону значений типа INTEGER ... |
Автор: | Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 18:42 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
Тема поднята с целью классифицировать сей феномен: - если это баг - будет типа пометка на исправление - если фича - то о ней надо сделать заметку в определении языка. Аналогично Цитата: Note: (-5) DIV 3 = -2 but -5 DIV 3 = -(5 DIV 3) = -1 Из-за этой баго-фичи я ошибку в модуле не мог найти. Математика безупречна, а местами - хрен поймёт что получалось. Через полгода полез повторно - и докопался. Да и то, скорее случайно, чем осознанно... |
Автор: | Info21 [ Пятница, 24 Сентябрь, 2010 18:59 ] |
Заголовок сообщения: | Re: "Понижение" типа константы - ошибка? |
Согласен, что угол недостаточно освещён. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |