Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.47 MB
Время: 0.004 c
15-1277152197
Юрий
2010-06-22 00:29
2010.09.19
С днем рождения ! 22 июня 2010 вторник


15-1277287798
картман
2010-06-23 14:09
2010.09.19
Кто об этом писал?


15-1276851347
Kerk
2010-06-18 12:55
2010.09.19
Кто-нибудь сталкивался с nosql-базами?


15-1277065796
Юрий
2010-06-21 00:29
2010.09.19
С днем рождения ! 21 июня 2010 понедельник


15-1277585052
AKE
2010-06-27 00:44
2010.09.19
Как звали французского шахматиста конца 18 века?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский