Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.019 c
15-1186401509
de.
2007-08-06 15:58
2007.09.02
Acer 5100


2-1186468272
gentos
2007-08-07 10:31
2007.09.02
как в TdxDBGrid делать кнопку с тремя точками в колонке ?


1-1182685511
WebSQLNeederr
2007-06-24 15:45
2007.09.02
Как удалить пустые строки в Мемо


11-1168543456
Psychedelic
2007-01-11 22:24
2007.09.02
Компонент ComboBoxEx (ComboBox с ImageList om) может кому надо...


15-1186046769
Kolan
2007-08-02 13:26
2007.09.02
Нарушаете ли вы инкапсуляцию намерянно?