Конвертация в 64bit

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Конвертация в 64bit

Сообщение mike » 09.11.2009 05:05:58

Кто в курсе почему при компиляции этого кода выдается предупреждение Warning: Mixing signed expressions and longwords gives a 64bit result?
Код: Выделить всё
var
  c1, c2: Cardinal;
begin
  c1:= 0;
  c2:= 100;
  Inc(c1, c2);

Варнинг относится к строчке инкремента, и выдается только если включена любая из проверок: Range, Overflow, Verify method calls. проверки IO и Stack не влияют. Причем это не просто варнинг, при включенных проверках оно реально генерит код 64-битного сложения. Может так задумано?
P.S. fpc-2.2.2/Win32
mike
новенький
 
Сообщения: 40
Зарегистрирован: 23.02.2007 17:25:00

Re: Конвертация в 64bit

Сообщение Light13 » 09.11.2009 09:50:32

посмотри какого типа формальные параметры у функции Inc - скорее всего целый знаковый, вот тебе компилятор и говорит, что тут можно и нарваться за выход диапазона значений (обрежет твое число).
замени на
Код: Выделить всё
c1+=c2
и посмотри что те скажет компилятор.

З.Ы. варнинги - весч хорошая :)
Аватара пользователя
Light13
постоялец
 
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Re: Конвертация в 64bit

Сообщение mike » 10.11.2009 02:40:48

Никто не спорит, что варнинги -- это полезно. Но вот что касается Inc/Dec, то это вроде как не функции, это операторы-псевдофункции по типу SizeOf/ReadLn/WriteLn. Они умеют работать с любыми ordinal-ами (а не только с целыми числами), а значит ни о каком знаке тут речи идти не может. А сишные операторы не подходят т.к. нужна совместимость с Delphi.
mike
новенький
 
Сообщения: 40
Зарегистрирован: 23.02.2007 17:25:00

Re: Конвертация в 64bit

Сообщение Vadim » 10.11.2009 04:08:21

mike
mike писал(а):Никто не спорит, что варнинги -- это полезно. Но вот что касается Inc/Dec, то это вроде как не функции, это операторы-псевдофункции по типу SizeOf/ReadLn/WriteLn. Они умеют работать с любыми ordinal-ами (а не только с целыми числами), а значит ни о каком знаке тут речи идти не может.

Ну, это Вы уже на другую тему перескочили. :) Компилятор то совершенно о другом говорит - то что Вы получаете в результате действия Inc() - это уже другой тип данных и об этом Вы должны знать на случай, если будет какая-то неявная ошибка в вычислениях..
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Конвертация в 64bit

Сообщение Sergei I. Gorelkin » 10.11.2009 11:00:50

Компилятор ведет себя несколько параноидально в отношении беззнаковых чисел. При любом намеке на вычитание он считает, что результат имеет знак, и если при этом в выражении есть другие беззнаковые операнды - генерится 64-битный код.
Судя по этом посту, вычитание даже не обязательно... хотя нужно поглядеть своими глазами, может оно откуда из кода проверки берется.
С другой стороны, 2.2.2 уже весьма стар, имеет смысл смотреть на 2.2.4.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Конвертация в 64bit

Сообщение mike » 11.11.2009 18:09:52

Судя по всему, в режиме вышеназванных проверок компилятор просто использует старшие 32 бита результата как признак переполнения. Странный подход, ведь проверки CF вполне достаточно. Или может это результат обобщения на случай иных аппаратных платформ, в которых вместо установки флага переполнения генерится исключение?
mike
новенький
 
Сообщения: 40
Зарегистрирован: 23.02.2007 17:25:00


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru
cron