Значение char c = 255, преобразованное в int - PullRequest
0 голосов
/ 15 февраля 2019

Мой вопрос касается параграфа в книге Страуструпа, язык программирования C ++, 4-е издание.Он приводит пример наличия

char c = 255; // 255 is ‘‘all ones,’ ’ hexadecimal 0xFF
int i = c;

и объяснение того, как он будет конвертирован на машинах, где char либо подписан, либо не подписан.

Какое значение будет иметь значение i?К сожалению, ответ не определен.В реализации с 8-битными байтами ответ зависит от значения шаблона «все единицы», когда он разбит на int.На машине, где символ не подписан, ответ - 255. На машине, где символ подписан, - -1.

Мой вопрос: почему он будет равен -1, не так?t это зависит от того, какое представление двоичных чисел используется на машине?Разве это не было бы 0 (-0), если он использует дополнение до 1, и -1, если дополнение до двух?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Давайте посмотрим на статью Подписанные числовые представления .

Ага!

Мы видим, что упомянуто 5 типов представлений:

  • Без знака
  • Знак и величина
  • Дополнение Единиц
  • Дополнение к двум
  • Смещенный двоичный код
  • База -2

(а для любопытных - больше Можно использовать и отрицательную базу с)

Давайте рассмотрим Сравнительную таблицу для 4-битных чисел.

Расширяя до 8-бит 1, мы видим, что:

  • Без знака = 255
  • Знак и величина = -127
  • Дополнение к единицам = -0
  • Дополнение к двум = -1
  • Excess-127 = 127
  • Base −2 = hm ... Мне нужно подумать об этом

Итак, Страуструп прав:

К сожалению, ответ не определен.В реализации с 8-битными байтами ответ зависит от значения шаблона "все единицы" в битовом символе при расширении в int

Но он не совсем прав:

На машине, где символ не подписан, ответ - 255. На машине, где символ подписан, - -1.

0 голосов
/ 15 февраля 2019

Цитирование C ++ 03 4.7 / 3:

Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и ширине битового поля);в противном случае значение определяется реализацией.

Предполагая, что байты имеют размер 8 бит, это означает, что теоретически вы получаете одно из следующего:

  • -127, если подписанокомпьютер величины.
  • -0 если компьютер дополняет.
  • -1 если компьютер дополняет два.

Первые два едва существуют в реальном мире.

0 голосов
/ 15 февраля 2019

(В случае char имеет 8-битный тип со знаком) 255 не является представимым значением.Преобразование непредставимого значения в тип со знаком приводит к значению, определенному реализацией (до C ++ 20).Итак, Страуструп немного упрощает этот шаг;результат может быть любым в этом случае, если речь идет о стандарте.

Но если допустить, что представление знака является дополнением к двум, вполне вероятно, что значение будет соответствовать 255 по модулю 2 8 (в будущем стандарте C ++ 20 это станет гарантией).Значение, которое совпадает с 255 по модулю 2 8 и представимо, равно -1 .

Не было бы 0 (-0), если оноиспользует их дополнение

Вероятно (до C ++ 20).Но их дополнение архаично и почти не используется.Итак, как я уже сказал, похоже, что Страуструп, похоже, решил упростить объяснение и предположил два дополнения.Или, может быть, он имел в виду будущий стандарт, когда писал его;Или, возможно, стандартное изменение было предложено, чтобы сделать его книгу правильной:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...