簡體   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