我有變數uint16 value,我想把它復制到uint8_t buffer[3]. 是否可以這樣做(小端):
*buffer=*(uint8_t *)&value;
代替:
buffer[0] = highByte(value);
buffer[1] = lowByte(value);
由于此替換導致 stm32f7 I2C 無法正常作業。有沒有正確的鑄造?
uj5u.com熱心網友回復:
STM32 是小端,因此您首先獲得最低有效位元組:
uint8_t* ptr = (uint8_t*)&value;
uint8_t low = ptr[0];
uint8_t high = ptr[1];
像這樣進行強制轉換和取消參考僅適用于字符型別。上面的代碼假設這uint8_t是一個字符型別,很可能是這種情況(在 gcc 和其他主流編譯器上)。
有關更多資訊,請參閱什么是 CPU 位元組序?
編輯:
如果您只是希望將 16 位數字復制到位元組陣列中,則正確的解決方案是:
memcpy(buffer, &value, sizeof(uint16_t)).
我們不能這樣做,*(uint16_t*) buffer=value;因為它呼叫了未定義的行為。buffer可能會錯位,這也是嚴格的別名違規。這就是為什么我在上面強調“這僅適用于字符型別”的原因。
uj5u.com熱心網友回復:
有沒有正確的鑄造?
不
*buffer = <expression>
將永遠并且只寫信給buffer[0]并且永遠不會寫信給buffer[1]。
你可以做的一件事 - 但我強烈敦促你不要是這樣的:
uint16_t *ptr = (uint16_t*)buffer; // Ugh, danger
*ptr = value;
如果您在具有不同位元組序的機器上運行它,這將是有問題的。而且很可能還有其他原因不這樣做。一旦你問自己是否可以通過強制轉換來解決某些問題,你真的應該退后一步。這是我寫過的兩個答案:
https://stackoverflow.com/a/62563330/6699433
https://stackoverflow.com/a/63773195/6699433
uj5u.com熱心網友回復:
假設要解決@Lundin 提到的與高端和低端相關的問題,以及取消參考 uint8_t 僅授予對它的第一個陣列元素的訪問權這一事實,我僅通過一次強制轉換就達到了此解決方案:
*(uint16_t*) buffer=value;
這是縮小版的:
uint16_t* p;
p= buffer;
*p=value;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380464.html
