Re[7]: Беззнаковая арифметика
От: Пётр Седов Россия  
Дата: 18.10.06 13:20
Оценка:
Здравствуйте, Cyberax, Вы писали:
C>Пётр Седов wrote:
>> Да, но обратите внимание на тему: "Беззнаковая арифметика". Речь не о том, что unsigned опасен, а о том, что беззнаковая арифметика опасна. Если переменная типа unsigned интерпретируется не как целое число, а как последовательность битов, то беззнаковой арифметики нет.
C>Еще один пример где со знаковой арифметикой неудобно — это работа с изображениями.
Изображения хранятся как массивы байтов (байт = unsigned char), чтобы экономить память. Но беззнаковой арифметики опять нет, так как в выражениях unsigned char продвигается (promote) до int (а не unsigned). Страуструп пишет в книге "Язык программирования C++" (третье издание):

В.6. Неявное преобразование типов
...
В.6.1. Продвижения
Неявные преобразования, сохраняющие значение, обычно называют продвижениями. Перед тем, как выполнить арифметическую операцию, используется интегральное продвижение — для того, чтобы создать переменные типа int из переменных более "коротких" целых типов.
...
Интегральные продвижения таковы:

Продвижения используются как часть обычных арифметических преобразований (§ В.6.3).
...
В.6.3. Обычные арифметические преобразования
Эти преобразования выполяются над операндами бинарного оператора, чтобы привести их к общему типу, который потом используется как тип результата:
...

Например, есть переменная типа unsigned char:
unsigned char n = 10;

Выражение 'n — 20' имеет тип int и равно -10, а не "very big unsigned number":
ostringstream s;
s << n - 20;
assert(s.str() == "-10");

Так что беззнаковые типы и беззнаковая арифметика — не одно и то же. Совет "избегайте беззнаковой арифметики" не значит "избегайте беззнаковых типов".
Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.