"Может кто-нибудь кратко объяснить, что было
происходит в char -> Int продвижение
который произвел 0xffffffef вместо
0x000000ef? "
Вопреки четырем ответам, пока нет.
Скорее, у вас было отрицательное значение char
, которое в качестве условия switch
было переведено в то же отрицательное значение int
, как требуется для
C ++ 98 §6.4.2 / 2
Интегральные акции выполняются.
Затем с вашим 32-битным компилятором C ++ 0xffffffef
был интерпретирован как литерал unsigned int
, потому что он слишком велик для 32-битного int
,
C ++ 98 2.13.1 / 2
Если он восьмеричный или шестнадцатеричный и не имеет суффикса, он имеет первый из этих типов в
которые можно изобразить: int
, unsigned int
, long int
, unsigned long int
.
Теперь для метки case
,
C ++ 98 §6.4.2 / 2
Интегральное выражение-константа (5.19) неявно преобразуется в
тип условия переключения.
В вашем случае, со знаком типа назначения, результат преобразования формально определяется реализацией,
C ++ 98 §4.7 / 3
Если тип назначения подписан, значение не изменяется, если оно может быть представлено
в типе назначения (и ширине битового поля); в противном случае значение
реализации.
Но на практике почти все компиляторы используют двоичное представление дополнения без перехвата, и поэтому преобразование, определяемое реализацией, в вашем случае означает, что битовый шаблон 0xffffffef
интерпретируется как спецификация дополнения двух отрицательного значения. Какое значение вы можете вычислить по 0xffffffef - 2 32 , потому что здесь мы говорим о 32-битном представлении. Или, так как это всего лишь 8-битное значение, которое было расширенным знаком до 32 бит, вы можете альтернативно рассчитать его как 0xef - 2 8 , где 0xef - код символа точка.
Приветствия и hth.,