Re[9]: Беззнаковая арифметика
От: Пётр Седов Россия  
Дата: 19.10.06 12:49
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Пётр Седов wrote:

>> C>Еще один пример где со знаковой арифметикой неудобно — это работа с изображениями.
>> Изображения хранятся как массивы байтов (байт = unsigned char), чтобы экономить память. Но беззнаковой арифметики опять нет, так как в выражениях unsigned char продвигается (promote) до int (а не unsigned).
C>С чего бы?
Это правило языка C++. Современные компиляторы следуют этому правилу.

C>У меня, например, везде работа с ними ведется как с unsigned char'ами, и никуда они не продвигаются.

Я уверен, что продвигаются. Это делается неявно. Например, есть такой код:
unsigned n = 10;
cout << n - 20 << endl;
cout << (n - 20 < 0) << endl;

Этот код выводит на консоль (MSVC6 Debug):
4294967286
0

Вместо -10 выводится "very big unsigned number" (в данном случае pow(2, 32) — 10). Такой "странный" результат получается из-за беззнаковой арифметики. Если заменить тип переменной n на unsigned char:
unsigned char n = 10;
cout << n - 20 << endl;
cout << (n - 20 < 0) << endl;

то код выводит другое:
-10
1

В выражении 'n — 20' unsigned char продвигается до int (неявно), поэтому арифметика знаковая. Результат получается такой же, как в обычной арифметике.
Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.