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

从c语言中的uint32_t值中提取uint8_t字节的可移植方法,c,casting,C,Casting,我取一个uint32_t值并将其提取为四个uint8_t值。我的代码使用GCC4.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

我取一个uint32_t值并将其提取为四个uint8_t值。我的代码使用GCC4.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\u t)
移除,这两种操作均有效且符合要求

无掩码
uint8_t字节0=(uint8_t)u32更干净


可移植性仅限于支持
uint32\u t
uint8\u t
的系统。(当然大多数人都需要)

在这两种情况下你都不需要石膏。对字节的隐式转换应该是正确的。无符号算术的定义是这样的。@Jens Gustedt显式转换使显式警告(例如-Wconversion)静音。@chux,这只是错误的方法。演员是邪恶的,转化是好的。Cast平息了任何错误的行为,隐式转换是为了正确的事情。@Jens Gustedt提到了
(uint8\u t)
的原因。它既不赞成也不赞扬选举。隐式转换也有其暗大小。在这种过于简单的情况下,除了消除由“-Wconversion”标记的警告之外,演员组没有什么好处。有些编码标准(不幸的是)强制使用“-Wconversion”,不管我们是否同意它们。@bitsmack,不是马上想到的。问题可能是您的代码已经包含了很多类型转换。因此,如果您关闭它并删除所有强制转换,您可能会收到许多关于
未签名
已签名
转换的警告。在那里,您将有机会获得所有正确的类型:),然后您可能会看到编译器抱怨尝试在不兼容的指针之间进行转换。在那里你会发现真正的虫子。更多关于你可以看到的