Стандарт понятен: при выполнении арифметики с целочисленным типом, меньшим int
, целое число сначала переводится в int
со знаком, если только int
не может представлять полный диапазон значений для исходного типа, в в этом случае вместо этого действует unsigned int
.
Мой вопрос: что является (было?) Мотивацией для этой политики? Почему неподписанные типы повышаются до int
, а не всегда до unsigned int
?
Конечно, на практике практически нет различий, поскольку базовая инструкция по сборке такая же (только расширение с нулем), но есть ключевой недостаток при переходе на signed int
, без явного роста, поскольку переполнения - это UB в знаковой арифметике, но четко определенной в беззнаковой арифметике.
Были ли исторические причины для предпочтения подписи int
? Существуют ли архитектуры, в которых не используется арифметика с дополнением до двух, в которой продвижение небольших типов без знака на int
вместо unsigned int
проще / быстрее?
РЕДАКТИРОВАТЬ: Я думаю, что это очевидно, но здесь я ищу факты (то есть некоторую документацию или ссылки, которые объясняют проектное решение), а не "в основном основанные на мнении" спекуляции.