Стандарты — В какой момент происходит неявное приведение в выражении C ++?

Это очень простой вопрос. Я заметил, что следующее, при компиляции в 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 ++ стандарт где-то? Как именно происходит это неявное приведение?

0

Решение

Это покрыто под проект стандарта C ++ раздел 5.8 Операторы смены параграф 1 который говорит:

[…] Операнды должны быть целочисленного или незаданного типа перечисления, и выполняются интегральные преобразования. […]

а также интегральные акции покрыты в разделе 4.5 Интегральные акции который в пункте 1 говорит:

Значение типа integer, отличное от bool, char16_t, char32_t или wchar_t, чей ранг целочисленного преобразования (4.13) меньше ранга int, может быть преобразовано в значение типа int, если int может представлять все значения типа источника ; в противном случае исходное значение prvalue может быть преобразовано в значение типа unsigned int.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]