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
...
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...
И я понимаю его как "constant expression" эквивалентна expression, который считает компилятор. А эквивалентность означает, что результаты операций должны быть такие же как были бы для переменных при выполнении кода. Т.е. LONGINT.
Цитата:
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/