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

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

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

Ответить
mike
новенький
Сообщения: 55
Зарегистрирован: 23.02.2007 16:25:00

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

Сообщение mike »

Кто в курсе почему при компиляции этого кода выдается предупреждение 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
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Сообщение Light13 »

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

З.Ы. варнинги - весч хорошая :)
mike
новенький
Сообщения: 55
Зарегистрирован: 23.02.2007 16:25:00

Сообщение mike »

Никто не спорит, что варнинги -- это полезно. Но вот что касается Inc/Dec, то это вроде как не функции, это операторы-псевдофункции по типу SizeOf/ReadLn/WriteLn. Они умеют работать с любыми ordinal-ами (а не только с целыми числами), а значит ни о каком знаке тут речи идти не может. А сишные операторы не подходят т.к. нужна совместимость с Delphi.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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

Сообщение Sergei I. Gorelkin »

Компилятор ведет себя несколько параноидально в отношении беззнаковых чисел. При любом намеке на вычитание он считает, что результат имеет знак, и если при этом в выражении есть другие беззнаковые операнды - генерится 64-битный код.
Судя по этом посту, вычитание даже не обязательно... хотя нужно поглядеть своими глазами, может оно откуда из кода проверки берется.
С другой стороны, 2.2.2 уже весьма стар, имеет смысл смотреть на 2.2.4.
mike
новенький
Сообщения: 55
Зарегистрирован: 23.02.2007 16:25:00

Сообщение mike »

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