Присвоение целого числа вне допустимого диапазона типу со знаком

signed char a = 128;
Предполагая, что байт равен 8 битам, это не определено?
Что я знаю, так это то, что назначение значения вне диапазона для типа со знаком не определено, но Бьярн Страуструп говорит на языке программирования C ++, что если я назначу целое число 255 для символа на 8-битной машине байтов, где символ подписан результат -1.

Всего 1 ответ


это не определено?

Нет.

Что я знаю, так это то, что присвоение значения вне диапазона для типа со знаком не определено

Тоже нет.

Правило, которое управляет этим, - преобразования между целочисленными типами. Является ли преобразование для инициализации или присвоения, не имеет значения.

При преобразовании целочисленного значения в целочисленный тип со знаком, если результат не может быть представлен, то:

В текущем стандарте C ++ 17: Полученное значение будет определено реализацией.

В следующем стандарте C ++ 20: значение будет совпадать с исходным значением по модулю 2 N , где N - ширина целевого типа (как и в случае целых чисел без знака). -1 совпадает с 255 по модулю 2 8 .


Обратите внимание, что в отличие от преобразования поведение арифметического переполнения со знаком не определено.


Есть идеи?

10000