Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.19;
Скачать: CL | DM;

Вниз

Странное переполнение   Найти похожие ветки 

 
И. Павел ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
3-1245398109
Patrick
2009-06-19 11:55
2010.09.19
Группировка данных при использовании ExpressQuantumGrid


2-1277317567
lihoy_p5
2010-06-23 22:26
2010.09.19
загрузка следующего изображения


11-1214765166
<>
2008-06-29 22:46
2010.09.19
Программа, написанная на KOL определяется как вирус!


15-1277349628
ixen
2010-06-24 07:20
2010.09.19
Не запускается программа. В чем может быть причина?


2-1277362042
ther
2010-06-24 10:47
2010.09.19
назначение клавишы для визарда/эксперта