Форум: "Прочее";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
ВнизСтранное переполнение Найти похожие ветки
← →
И. Павел © (2010-06-21 08:50) [0]В Delphi7:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
i64: Int64;
begin
i := -2147483648;
i64 := -2147483648;
end;
Для обоих операций: [Error] Unit1.pas(32): Overflow in conversion or arithmetic operation.
Диапазон integer: -2147483648..2147483647. Оператор i := $80000000 отрабатывает без ошибок.
Почему Delphi не воспринимает литерал -2147483648?
← →
Anatoly Podgoretsky © (2010-06-21 09:54) [1]> И. Павел (21.06.2010 08:50:00) [0]
Потому что она считает, что это Integer, ты сделай приведение к Int64
← →
И. Павел © (2010-06-21 10:10) [2]> Потому что она считает, что это Integer, ты сделай приведение
> к Int64
Но ведь число -2147483648 не выходит за пределы диапазона integer - это его нижняя граница: $80000000.
На i := int64(-2147483648); тоже ругается.
← →
RWolf © (2010-06-21 10:16) [3]баг, видимо.
16-ичная запись работает в любом случае.
← →
begin...end © (2010-06-21 10:20) [4]i := -2147483647 - 1
:-D
← →
sniknik © (2010-06-21 10:20) [5]может просто упрощение проверки? типа от 0 до максимума по модулю (исключая бит знака), получается быстрее, в одно действие, а то что 1 значение выпадает... ну так ли это критично?
← →
Плохиш © (2010-06-21 10:22) [6]
> И. Павел © (21.06.10 10:10) [2]
> Но ведь число -2147483648 не выходит за пределы диапазона
> integer
Мне влом хелп открывать, но граница integer -2147483647
← →
Плохиш © (2010-06-21 10:25) [7]
> Плохиш © (21.06.10 10:22) [6]
А не, ошибочка.
PS. Напиши разработчикам о найденом баге.
← →
И. Павел © (2010-06-21 10:31) [8]RWolf ©, begin...end ©, sniknik ©, Плохиш ©
Спасибо. Похоже, действительно просто упрощенная или не правильная проверка литерала. Это мелочь, конечно, просто было интересно.
← →
begin...end © (2010-06-21 10:32) [9]i := Low(Integer)
:-D
← →
Jeer © (2010-06-21 10:36) [10]Скорее всего конверсия выполняется так:
- получение обратного кода положительного числа;
- получение дополнительного ( прибавление 1 )
А вот тут 2147483648 - вылет за границы плюсового диапазона.
← →
И. Павел © (2010-06-21 11:00) [11]> [10] Jeer © (21.06.10 10:36)
Спасибо.
А при присвоении положительного числа переполнение не учитывается: i := 2147483648; предупреждает о переполнении но компильруется (в итоге i = -2147483648 :). Так что просто минус можно было не ставить :)
← →
Плохиш © (2010-06-21 13:21) [12]Кстати, в BDS2006 никаких переполнений нет.
← →
И. Павел © (2010-06-21 13:27) [13]> Кстати, в BDS2006 никаких переполнений нет.
В 2005 тоже все работает. Видимо, поправили.
← →
Empleado © (2010-06-21 13:36) [14]http://www.delphikingdom.com/asp/viewitem.asp?catalogID=831
← →
И. Павел © (2010-06-21 13:57) [15]> [14] Empleado © (21.06.10 13:36)
Спасибо.
Оказывается, у этой особенности обработки констант даже название есть: "Третье чудо дельфи" :) А я то надеялся, что хоть в Delphi чудес не бывает :)
← →
Плохиш © (2010-06-21 14:44) [16]По ссылке половина "чудес" высосана из пальца...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c