我的问题看起来很像
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由最右边的八位填充,而不是最左边的八位?
发布于 2010-06-28 22:58:05
是。执行以下任一操作:
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;第一个示例不依赖于平台字节顺序,第二个依赖于平台字节顺序。
发布于 2010-06-28 22:52:48
我不知道你说的最右边和最左边是什么意思(字节顺序?)但C保证a将包含b的8个低位(最低有效)位。也就是说,赋值在逻辑上等同于:
a = b % ((uint32_t)UINT8_MAX + 1);发布于 2010-06-28 22:59:08
根据C标准,可以保证a == b % (max_of_uint8_t + 1),即最低有效的8比特。在§6.3.1.3 (有符号和无符号整数)中:
_Bool以外的其他整数类型时,如果该值可以由新类型表示,则如果新类型是无符号的,则为,通过重复添加或减去比新类型可以表示的最大值多一的值来转换该值,直到该值在新类型的范围内为止如果需要安全起见,请使用a = b & 0xff。
https://stackoverflow.com/questions/3133376
复制相似问题