Объект типа int32_t
может хранить значение типа uint16_t
.
Из стандарта C (6.2.6.2 Целочисленные типы)
5 Значения любых битов заполнения не указаны.54) Допустимо (без ловушки) объектное представление целочисленного типа со знаком, где бит знака равен нулю, является допустимым представлением объекта соответствующего беззнакового типа и должно представлять то же значение .
Когда объект целого числа со знаком Тип, например, int16_t
, преобразуется в больший целочисленный тип, например int32_t
, когда, если этот объект имеет отрицательное значение, его знаковый бит распространяется до размера большего целочисленного типа.
Так, например, если у вас есть следующее объявление
signed char c = -1;
, тогда оно имеет внутреннее представление в двух системах дополнений, например
11111111
Если вы конвертируете его в int16_t или uint16_t, то как
int16_t i = c;
uint17_t ui = c;
, тогда в обоих случаях внутренние представления будут выглядеть как
11111111 11111111
Однако, если у вас есть объект беззнакового символьного типа, например
unsigned char c = 255;
с внутренним представлением, например
11111111
, тогда в этом случае переменные i и ui, объявленные как
int16_t i = c;
uint17_t ui = c;
, будут иметь следующее внутреннее представление
00000000 11111111
, потому что значение 255
является допустимым значением для объектов этих типов.