繁体   English   中英

从c中的uint32_t值中提取uint8_t字节的可移植方法

[英]Portable method to extract uint8_t bytes from uint32_t values in c

我正在使用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)删除。

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

无掩码uint8_t byte0 = (uint8_t)u32; 更干净。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM