浮点数转换成两个16位整数的C语言

浮点数转换成两个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

我想把一个浮点数转换成两个16位整数。 我编写的代码如下所示:

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位寄存器的按位复制来实现。