Текущий архив: 2007.09.02;
Скачать: CL | DM;
Вниз
Comparing signed and unsigned types - widened both operands Найти похожие ветки
← →
denewb (2007-08-10 20:03) [0]Почему это предупреждение тут возникает?
function _: LongWord;
begin
_ := 5;
end;
procedure TForm1.Button4Click(Sender: TObject);
const
const1 = 2;
var
i1: Word;
begin
i1 := 3;
if _ > i1 - const1 then Halt;
end;
← →
Loginov Dmitry © (2007-08-10 20:33) [1]Из-за того, что типы в левой и в правой части операции сравнению будут разные. Делай приведение типов:
if Integer(_) > ......
← →
denewb (2007-08-10 22:04) [2]Спасибо. Я тоже думал про приведение типов. Но не понял почему именно в первой части приведение (в _ ), и почему именно Integer, ведь у меня все беззнаковое. ?
почему не:
1. if _ > LongWord(i1 - const1) then Halt;
2. if Word(_) > i1 - const1 then Halt;
3. if _ > LongWord(i1) - const1 then Halt;
3. if _ > i1 - LongWord(const1) then Halt;
?
← →
Юрий Зотов © (2007-08-10 22:13) [3]> denewb (10.08.07 22:04) [2]
> ведь у меня все беззнаковое.
Правая часть - знаковая (i1 - const1).
← →
denewb (2007-08-11 10:26) [4]Хмм... а как такое получается, что правая часть становится знаковой? (i1 - const1). Пробовал, строго задавать константу:
const
const1: Word = 2;
Но опять же предупреждение. Не понимаю, как получается знаковая часть, ведь все вокруг беззнаковое.
← →
Юрий Зотов © (2007-08-11 12:38) [5]> denewb (11.08.07 10:26) [4]
Unsigned1 - Unsigned2 может оказаться меньше нуля. Конечно, результат можно трактовать и как беззнаковый, но компилятор трактует, как знаковый.
И правильно делает, потому что при другой трактовке результат мог бы быть неверным:
Unsigned1 := 1;
Unsigned2 := 2;
Unsigned3 := 3;
if Unsigned3 > Unsigned1 - Unsigned2 then...
И тут засада: результат сравнения зависит от трактовки результата вычитания Unsigned1 - Unsigned2. Если трактовать его, как знаковый, то получим True (3 > 1 - 2), иначе False (3 < $FFFFFFFF). К "человеческой" логике ближе первый способ, поэтому он и заложен в компилятор, как дефолтный. А если нам нужен второй способ, то никто не мешает привести результат к беззнаковому типу.
← →
Dimaxx © (2007-08-12 10:54) [6]А не проще ли сразу использовать один тип? Если уж начато с LongWord, то и в дальнейшем использовать именно его.
Страницы: 1 вся ветка
Текущий архив: 2007.09.02;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.023 c