从c语言中的uint32_t值中提取uint8_t字节的可移植方法
我取一个uint32_t值并将其提取为四个uint8_t值。我的代码使用GCC4.9,但我不知道它的可移植性如何 这项工作:从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 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,不是马上想到的。问题可能是您的代码已经包含了很多类型转换。因此,如果您关闭它并删除所有强制转换,您可能会收到许多关于未签名
到已签名
转换的警告。在那里,您将有机会获得所有正确的类型:),然后您可能会看到编译器抱怨尝试在不兼容的指针之间进行转换。在那里你会发现真正的虫子。更多关于你可以看到的