Этот ответ в значительной степени направлен на комментарий, сделанный @ RafałDowgird:
"Минимальный размер операций - int." - Это было бы очень странно
(как насчет архитектур, которые эффективно поддерживают char / short
операции?) Это действительно в спецификации C ++?
Имейте в виду, что стандарт C ++ имеет крайне важное правило "как будто". См. Раздел 1.8: Выполнение программы:
3) Это положение иногда называют правилом «как будто», потому что
реализация свободна игнорировать любое требование стандарта
до тех пор, пока результат, как если бы требование было выполнено, насколько
как можно определить из наблюдаемого поведения программы.
Компилятор не может установить размер int
равным 8 битам, даже если он был самым быстрым, поскольку стандарт предписывает 16-разрядный минимум int
.
Следовательно, в случае теоретического компьютера со сверхбыстрыми 8-битными операциями неявное повышение до int
для арифметики может иметь значение. Однако для многих операций вы не можете определить, действительно ли компилятор выполнял операции с точностью до int
, а затем преобразовал в char
для хранения в вашей переменной, или все операции выполнялись в char все время.
Например, рассмотрим unsigned char = unsigned char + unsigned char + unsigned char
, где сложение будет переполнено (допустим, значение 200 для каждого). Если вы повысите до int
, вы получите 600, что затем будет неявно понижено до unsigned char
, который обернется по модулю 256, что даст конечный результат 88. Если вы не сделали таких повышений, вы бы придется обернуть между двумя первыми дополнениями, что уменьшило бы проблему с 200 + 200 + 200
до 144 + 200
, что составляет 344, что уменьшает до 88. Другими словами, программа не знает разницы, поэтому компилятор может свободно игнорировать мандат на выполнение промежуточных операций в int
, если операнды имеют более низкий рейтинг, чем int
.
Это верно в общем случае сложения, вычитания и умножения. Это вообще не верно для деления или модуля.