Литье большого числа типов в меньший тип
Я хорошо осмотрелся и не могу найти подобный вопрос, так что извиняюсь, если он был задан раньше.
Я просто играю с типами и числами, и мне интересно, можно ли гарантировать следующее поведение.
Если я объявляю 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, и приведенные выше результаты - удача?
Ответы
Ответ 1
Гарантируется ли, что если я передам 16-разрядный тип 8-разрядному типу, который будет потерян, старший байт будет
Зависит от того, работаете ли вы с подписанными или неподписанными типами (см. раздел 4.7 §2 и §3):
Если тип назначения без знака, результирующее значение представляет собой наименьшее беззнаковое целое, совпадающее с исходным целым (по модулю 2 ^ n, где n - количество бит, используемых для представления неподписанного типа). [Примечание: в представлении с двумя дополнениями это преобразование является концептуальным и нет изменений в битовой схеме (если нет усечения).]
Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и ширине битового поля); в противном случае значение определяется реализацией.
Поскольку вы работаете с неподписанными типами, поведение хорошо определено.