我正在用嵌入式C做一些工作,使用加速度計作爲14位二進制補碼來返回數據。我將這個結果直接存入uint16_t
。後來在我的代碼中,我試圖將這個「原始」形式的數據轉換爲一個有符號的整數,以表示/處理其餘代碼。將原始14位二進制補碼轉換爲有符號16位整數
我無法讓編譯器理解我正在嘗試做什麼。在下面的代碼中,我檢查第14位是否被設置(表示數字是負數),然後我想反轉這些位並加1以獲得數字的大小。
int16_t fxls8471qr1_convert_raw_accel_to_mag(uint16_t raw, enum fxls8471qr1_fs_range range) {
int16_t raw_signed;
if(raw & _14BIT_SIGN_MASK) {
// Convert 14 bit 2's complement to 16 bit 2's complement
raw |= (1 << 15) | (1 << 14); // 2's complement extension
raw_signed = -(~raw + 1);
}
else {
raw_signed = raw;
}
uint16_t divisor;
if(range == FXLS8471QR1_FS_RANGE_2G) {
divisor = FS_DIV_2G;
}
else if(range == FXLS8471QR1_FS_RANGE_4G) {
divisor = FS_DIV_4G;
}
else {
divisor = FS_DIV_8G;
}
return ((int32_t)raw_signed * RAW_SCALE_FACTOR)/divisor;
}
此代碼不幸運行不起作用。反彙編表明,出於某種原因,編譯器正在優化我的聲明raw_signed = -(~raw + 1);
我如何實現我期望的結果?
數學的作品在紙上,但我覺得由於某種原因,編譯器和我一起戰鬥:(。
你可以試試'if(raw&_14BIT_SIGN_MASK)raw_signed =(int16_t)(raw | 0xC000);' –
沒有語言「emb編輯C「。左移一個無法在變量中表示的有符號值是未定義的行爲。 – Olaf
如果你打開所有的編譯器警告,你有沒有得到任何相關的診斷?如果在關閉優化的情況下進行編譯,程序是否按預期工作? –