Подтвердить что ты не робот

Литье большого числа типов в меньший тип

Я хорошо осмотрелся и не могу найти подобный вопрос, так что извиняюсь, если он был задан раньше.

Я просто играю с типами и числами, и мне интересно, можно ли гарантировать следующее поведение. Если я объявляю 2 переменные как

unsigned char BIT_8 = 0;
unsigned short int BIT_16 = 0xFF01;

а затем выполните следующие действия (игнорируя покадровый стиль C, если это не повлияет на это?)

cout << "BIT_16: " << BIT_16 << "\n";
cout << "BIT_8: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16;
cout << "BIT_8 after: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16 >> 8;
cout << "BIT_8 after shift: " << (int)BIT_8 << "\n";

Я получаю вывод

BIT_16: 65281
BIT_8: 0
BIT_8 after: 1
BIT_8 after shift: 255

Гарантируется ли, что если я передам 16-разрядный тип 8-разрядному типу, который будет потерян, то будет вестись старший байт? или это undefined, и приведенные выше результаты - удача?

4b9b3361

Ответ 1

Гарантируется ли, что если я передам 16-разрядный тип 8-разрядному типу, который будет потерян, старший байт будет

Зависит от того, работаете ли вы с подписанными или неподписанными типами (см. раздел 4.7 §2 и §3):

Если тип назначения без знака, результирующее значение представляет собой наименьшее беззнаковое целое, совпадающее с исходным целым (по модулю 2 ^ n, где n - количество бит, используемых для представления неподписанного типа). [Примечание: в представлении с двумя дополнениями это преобразование является концептуальным и нет изменений в битовой схеме (если нет усечения).]

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

Поскольку вы работаете с неподписанными типами, поведение хорошо определено.