2016-02-03 111 views
0

我嘗試從modbus轉換值。 設備顯示「-1.0」,退色值爲65535(uint16)。 我現在嘗試將此值重新轉換爲double。 我已經嘗試過不同的演員陣容。 這讓我總是65353.00 :(將double轉換爲uint和retour

我們如何轉換成雙重否定的uint值?

typedef unsigned short uint16; 

int main() { 

double dRmSP = -1.0;      //-1.0000 ok 
uint16 tSP = static_cast<uint16>(dRmSP); // = 65535 ok 

// retour 
double _dRmSP = static_cast<double>(tSP); // = 65535.0000 why?? 

// try 
double _dRmSP_ = static_cast<double>(static_cast<int>(tSP)); // =65535.0000 why?? 

return 0; 
} 

回答

2

根據定義,負的無符號值不存在。所以你不能把它轉換成任何東西。

您的實際情況是 - 從您的設備獲取數據 - 首先將值-1.0轉換爲unsigned值。邏輯,因爲-1.0超出unsigned可以表示的值的範圍是使用模運算。

工作的,用於負輸入的值(如-1.0)中,用最大值65535(對應於16位unsigned)的unsigned變量的方法是保持直到065535之間所獲得的結果添加65536 = 65535 + 1。對於-1.0,這產生了65535.0的結果。當該值轉換爲unsigned時,結果爲65535

這解釋了當您的設備顯示-1.0時,爲什麼得到值爲65535

你對「retour」所做的嘗試是顛倒過程。這是不夠的轉換一個unsigneddouble(如你是),因爲一個double可以代表65535.0(至少,的數值精度限度之內)。

的第一步是您的值轉換爲double(將65535轉換爲65535.0,因爲一個double可以的浮點精度的限制)內再次表示這樣的值(

下一步 - 這你是不是在執行 - 需要你需要有什麼樣的最小(或最大)值是你的設備實際上支持了一些想法 - 你需要從文件獲得舉例來說,如果最小值您的設備可以代表是-100.0(或者最大值爲65435.0),那麼您可以反轉該過程 - 繼續減去65536.0,直到得到結果-100.065435.0

在代碼中,這可能是由

double dRmSP = -1.0;      //-1.0000 ok 
uint16 tSP = static_cast<uint16>(dRmSP); // = 65535 ok 

// retour 
double dRmSP = static_cast<double>(tSP); // = 65535.0000 - as described above 

while (dRmSP > 65435.0) dRmSP -= 65536.0; // voila! -1.0 obtained 
+0

做最好的解釋步驟如何從一個「負」單元值原路折回RETOUR。謝謝! –

3

你服用uint16值65535,把它變成一個double,這是65535.0。
有沒有其他有效的預期。

變量tSP不會「記住」,它的價值從原來的價值-1.0一個double來了。tSP是無符號INTE ger值65535;期。

我們如何將double uint值轉換爲double?

沒有「負面uint值」。 「u」代表無符號,這意味着負值不在該類型的值域中。

如果您希望使用dRmSP,請使用dRmSP,而不是其他類型和值不同的其他變量。

0

首先,沒有負的無符號整數值。無符號表示沒有符號位。

你做了什麼:

uint16 t1(-1.0); // wraps around to positive 65535 
auto t2 = static_cast<double>(t1); // turns 65535 to 65535.0 (no wrapping) 

如果您希望此爲負值工作使用int或類似的(非無符號整數)類型。但是,如果你這樣做,那麼記住你會失去一點價值(如果你使用int16)。