2016-02-03 67 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)。