我正在使用uint32_t值并将其提取为四个uint8_t值。我的代码适用于gcc 4.9,但我不知道它的可移植性。

这有效:

uint32_t u32 = 0xdeadbeef;

uint8_t byte3 = (uint8_t)(u32 >> 24);  // 0xde
uint8_t byte2 = (uint8_t)(u32 >> 16);  // 0xad
uint8_t byte1 = (uint8_t)(u32 >> 8);   // 0xbe
uint8_t byte0 = (uint8_t)u32;          // 0xef

这符合标准吗?还是我应该这样更明确:
uint32_t u32 = 0xdeadbeef;

uint8_t byte3 = (uint8_t)((u32 & 0xFF000000) >> 24);
uint8_t byte2 = (uint8_t)((u32 & 0x00FF0000) >> 16);
uint8_t byte1 = (uint8_t)((u32 & 0x0000FF00) >> 8);
uint8_t byte0 = (uint8_t)(u32 & 0x000000FF);

我正在使用强制转换使使用-Wconversion开关编译时收到的转换警告静音。

最佳答案

既可以工作,又可以合规。

无遮罩的uint8_t byte0 = (uint8_t)u32;更干净。

可移植性仅限于支持uint32_tuint8_t的系统。 (当然多数是这样)

10-08 16:28