簡體   English   中英

將傳感器數據(二進制補碼)轉換為有符號整數

[英]Converting sensor data (two's complement) to signed integer

我看過一些有類似背景的舊帖子,但答案是代碼片段,而不是解釋性的。 而且我什至無法獲得這些答案中提供的代碼進行編譯。

如果格式或解釋不當,我提前道歉,我是 C++ 新手,我不惜一切代價避免在論壇上提問,但這已成為我的真正眼中釘。

我正在使用 C++ 訪問加速度計的內存寄存器。 該寄存器包含 8 位二進制補碼形式的數據。

加速度計的范圍設置為 +/- 2 g,這意味着(參見第 10 頁參考手冊的第 1.5 節)

我的目標是獲取這個二進制補碼數據並將其作為帶符號的 base-10 數據保存到文本文件中。

相關代碼如下:

        while(1)
    {
            int d = 0;
            d= wiringPiI2CReadReg8(fd, DATA_X_H);
            d = (int8_t)d;
            d = d * EIGHTBITCONV;
            std::cout << d << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }

我已經通過將“d”硬編碼為 01111111(127)來測試程序,並且程序返回“73”。 但是將“d”硬編碼為 10000001 (-127) 並且程序返回正確的“-127”。

所以程序只有在處理負數時才能正常運行。

發生這種情況是因為當將浮點數“d”轉換為 8 位整數時,它會截斷正數的前導零? 我將如何解決這個問題?


數據表鏈接:https: //www.mouser.com/datasheet/2/348/KX132-1211-Technical-Reference-Manual-Rev-1.0-1652679.pdf

  1. 您不需要將 2 的補碼轉換為“有符號整數”,因為 2 的補碼是有符號整數。

  2. 您只讀取 8 位,但intwiringPiI2CReadReg8的返回類型)有更多。 所以你需要一個符號擴展轉換。 就像是:

int result = (int)(signed char)wiringPiI2CReadReg8(fd, DATA_X_H);

(int)轉換是隱式的,可以省略。 在您的情況下,您正在轉換為浮點數(轉換再次是隱式的)。 所以:

d = (signed char)wiringPiI2CReadReg8(fd, DATA_X_H);

實際上,您的解決方案(兩次否定)也可以。 更明確地說,它可以這樣寫(因為 1 是int ):

 d = -((int)(~(int8_t)d) + 1);

但這只是不必要的工作。 可以簡化為:

d = -(-(int8_t)d);

現在它顯然簡化為:

d = (int8_t)d;

和我之前寫的一樣。

好的,所以我認為我的很多困惑來自這樣一個事實,即我在沒有正確知識的情況下嘗試將代碼值硬編碼到我的程序中。

如果我要進行硬編碼作為測試邏輯的方法,我應該指定“d”的值是二進制的。

所以看起來我的原始代碼雖然非常草率,但運行正常。

暫無
暫無

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

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