![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Comparing signed and unsigned types - widened both operands [D7, XP]
denewb © (2007-08-10 20:03:00)Почему это предупреждение тут возникает?
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;
Dimaxx (2007-08-12 10:54:00) [1]А не проще ли сразу использовать один тип? Если уж начато с LongWord, то и в дальнейшем использовать именно его.
Юрий Зотов (2007-08-11 12:38:00) [2]> 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). К "человеческой" логике ближе первый способ, поэтому он и заложен в компилятор, как дефолтный. А если нам нужен второй способ, то никто не мешает привести результат к беззнаковому типу.
denewb (2007-08-11 10:26:00) [3]Хмм... а как такое получается, что правая часть становится знаковой? (i1 - const1). Пробовал, строго задавать константу:
const
const1: Word = 2;
Но опять же предупреждение. Не понимаю, как получается знаковая часть, ведь все вокруг беззнаковое.
Юрий Зотов (2007-08-10 22:13:00) [4]> denewb (10.08.07 22:04) [2]
> ведь у меня все беззнаковое.
Правая часть - знаковая (i1 - const1).
denewb (2007-08-10 22:04:00) [5]Спасибо. Я тоже думал про приведение типов. Но не понял почему именно в первой части приведение (в _ ), и почему именно 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;
?
Loginov Dmitry (2007-08-10 20:33:00) [6]Из-за того, что типы в левой и в правой части операции сравнению будут разные. Делай приведение типов:
if Integer(_) > ......