簡體   English   中英

將uint8_t轉換為int8_t

[英]Casting uint8_t to int8_t

使用Microchip XC8我有一個構造

int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff; 

test = ((((int16_t)msb)<<8) + (int16_t)lsb) + (int8_t)hyst);

我希望測試為-13(oxFFF3),因為我使用帶符號的數字,但計算為0xF3。

為什么?

編輯:嘗試與gcc和結果是我所期望的。

正如奧拉夫(Olaf)正確指出的那樣,如果int的寬度為16,則移位操作可能沒有定義的行為,因為您正在將一位移入int16_t的符號位。 然后,您的代碼是錯誤的,並且您無法推斷出平台可能實現的價值。

如果int較大,則表達式的一切都很好,您只需要添加適合int正值即可。 但是由於初始化,結果值將被轉換回int16_t ,這將導致“實現定義的”轉換或信號的int16_t 因此,您應該檢查編譯器文檔,在這些情況下平台將執行什么操作,並且如果可以的話,最好避免使用它。

從評論中確定

int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff; 

test = (int16_t)(((uint16_t)msb)<<8) + (uint16_t)lsb) + (int8_t)hyst;

解決了問題。 感謝大伙們!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM