Это очень простой вопрос. Я заметил, что следующее, при компиляции в MSVS2012, производит ожидаемый Результат 0x3412
за val
:
unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);
Я бы на самом деле ожидал разыменованный указатель на символ *(ch+1)
на право производить голец ценность 0x34
, который затем будет сдвинут влево на 8 битов 0x00
, Кажется, что в момент времени значение разыменовывается, оно уже хранится в типе, достаточно большом, чтобы содержать как минимум два байта.
Это указано в C ++ стандарт где-то? Как именно происходит это неявное приведение?
Это покрыто под проект стандарта C ++ раздел 5.8
Операторы смены параграф 1 который говорит:
[…] Операнды должны быть целочисленного или незаданного типа перечисления, и выполняются интегральные преобразования. […]
а также интегральные акции покрыты в разделе 4.5
Интегральные акции который в пункте 1 говорит:
Значение типа integer, отличное от bool, char16_t, char32_t или wchar_t, чей ранг целочисленного преобразования (4.13) меньше ранга int, может быть преобразовано в значение типа int, если int может представлять все значения типа источника ; в противном случае исходное значение prvalue может быть преобразовано в значение типа unsigned int.
Других решений пока нет …