我的问题看起来很像
How to store a 64 bit integer in two 32 bit integers and convert back again
(我有一个无符号32位,我需要在C中放入4个无符号8位变量)
但
我的问题是:
uint8_t a;
uint32_t b;
a = b;
保证a填充了最右边的8位,而不是最左边的8位?
答案 0 :(得分:16)
是。这样做:
uint32_t num32 = 0xdeadbeef;
uint8_t a = num32; /* 0xef */
uint8_t b = num32 >> 8; /* 0xbe */
uint8_t c = num32 >> 16; /* 0xad */
uint8_t d = num32 >> 24; /* 0xde */
或者这个:
union u
{
uint32_t num32;
struct
{
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
} bytes;
} converter;
converter.num32 = 0xdeadbeef;
第一个示例不依赖于平台endianess,第二个 。
答案 1 :(得分:9)
我不知道你最左边和最左边是什么意思(字节序?)但C保证a
将包含b
的8个低阶(最低有效)位。也就是说,赋值在逻辑上等同于:
a = b % ((uint32_t)UINT8_MAX + 1);
答案 2 :(得分:5)
从C标准,保证a == b % (max_of_uint8_t + 1)
,即最低有效8位。在§6.3.1.3(有符号和无符号整数)中:
- 当具有整数类型的值转换为除
_Bool
以外的其他整数类型时,如果该值可以由新类型表示,则它将保持不变。- 否则,如果新类型是无符号的,通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。 强>
醇>
如果您需要安全,请使用a = b & 0xff
。
答案 3 :(得分:0)
您可以查看union declaration。如果您可以保证处理器/数据源不会改变,我认为您可以假设“endianness”