浮点数转换成两个16位整数的C语言
我想把一个浮点数转换成两个16位整数。 我编写的代码如下所示:浮点数转换成两个16位整数的C语言,c,C,我想把一个浮点数转换成两个16位整数。 我编写的代码如下所示: float floatCurrentVolume = 1234.50; uint32_t ui32TemperaryVariable1; uint16_t ui8ModbusRegister[2] = {0}; ui32TemperaryVariable2 =(uint32_t ) floatCurrentVolume; ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolu
float floatCurrentVolume = 1234.50;
uint32_t ui32TemperaryVariable1;
uint16_t ui8ModbusRegister[2] = {0};
ui32TemperaryVariable2 =(uint32_t ) floatCurrentVolume;
ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolume && 0x0000FFFF);
ui8ModbusRegister[1] = (uint16_t )((ui32TemperaryVariable3 >> 16) && 0x0000FFFF);
基本上,floatCurrentVolume应该分成两个16位寄存器。
但是当我检查输出时,我得到ui8ModbusRegister[0]=0,ui8ModbusRegister[1]=1。
代码有什么问题???您使用了错误的&&和&字符用例。第一种情况是逻辑AND,结果是1或0,而第二种情况是按位AND,这就是您要查找的
ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolume && 0x0000FFFF);
ui8ModbusRegister[1] = (uint16_t )((ui32TemperaryVariable3 >> 16) && 0x0000FFFF);
应该是
// |--here
ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolume & 0x0000FFFF);
ui8ModbusRegister[1] = (uint16_t )((ui32TemperaryVariable3 >> 16) & 0x0000FFFF);
// |--here
如果您真的想发送包括小数在内的整个浮点数,则必须复制内存,如下所示:
//Copy float to modbus register
memcpy(ui8ModbusRegister, &floatCurrentVolume, sizeof floatCUrrentVolume);
//And then on receive side, copy it back before read
memcpy(&floatCurrentVolume, ui8ModbusRegister, sizeof floatCUrrentVolume);
最可移植的方法是在字节级将浮点复制到uint\u t中。任何其他方式都会在某个时间或更糟的时间涉及到未定义的行为,可能会使用浮点到整数的截断。例如ui32TemperaryVariable2=uint32\u t floatCurrentVolume;将ui32TemperaryVariable2设置为1234,这不应是您所期望的 正确的方法是:
memcpy(ui8ModbusRegister, &floatCurrentVolume, sizeof(ui8ModbusRegister));
这将正确地将高阶16位字存储在UI8MODBUS寄存器[0]中,将低阶字存储在UI8MODBUS寄存器[1]中。也许直接深度复制会更好
float floatCurrentVolume = 1234.50;
uint16_t ui8ModbusRegister[2];
memcpy(ui8ModbusRegister, &floatCurrentVolume, 4);
C!=C++!C、 它们是不同的语言,需要这样对待:请选择一个并坚持使用。请使用Ctrl+K或用四个空格缩进代码。另外,C和C++是两种不同的语言,请选择一种。这看起来是C,但是,CPLUPLUS错误C++编译器SedifTHY可能不是唯一的问题。如果他希望在2个modbus寄存器ui32TemperaryVariable2=uint32\u t floatCurrentVolume上具有浮点值;也应该用memcpy替换。@user694733这是真的,但从他的角度来看,他希望它是整数。如果是整个浮点,那么我同意你的看法,memcpy是必需的。我怀疑他只是说他想要转换成整数,因为modbus协议不支持开箱即用的浮点。它们通常使用2个16位寄存器的按位复制来实现。