c++ - (unsigned __int16 to float) 和 float to (unsigned __int16) typecast vs union in C++

标签 c++ casting unions

我有 3000 个浮点型(4 字节)变量和 2000 个无符号 __int16(2 字节)变量。这些变量存储来自 plc 的数据。

我有一个常量结构数组,它存储每个 plc 标签的信息。

struct  strPLCtags
{
    unsigned short   id ;           //plc tag id        
    unsigned __int16 mbaddress ;    //plc Modbus address    
    String           name ;         //plc tag name  
    String           description ;  //plc tag description   
    Byte             datatype  ;    // 2 = ushort ; 4 = float  
    Byte             plcaccess   ;  //Read, Write, Read/Write Tag
};

const strPLCtags  plcTags[5000] = {{....},{....},.................,{....}};

我想将上述所有变量(3000 float + 2000 ushort)分组为一个数组 [5000]。因此,我可以根据标签索引访问 plc 标签的值。

我想到了两个解决方案。但不确定使用哪个是正确的。

方案一:声明float数组[5000],并根据plc标签id取值。

  float   PLCDataArray1[5000] ;

  //Get PLC data and assign to array

  PLCDataArray1[0]    = static_cast<float>(GetU16ValueFromPLC(addr)) ;
  PLCDataArray1[1]    = GetFloatValueFromPLC(addr) ;
  .
  .
  PLCDataArray1[4999] = GetFloatValueFromPLC(addr) ;

 //To read back above data as String and show it on form.
 String GetPLCData(unsigned short tid) //tid is plc tag id
 {
     if(plcTags[tid] == 2)
     {
         return IntToStr(PLCDataArray1[tid]) ;
     }
     else
     {
         return FloatToStrF(PLCDataArray1[tid],ffFixed,6,2) ; 
     }
 }

解决方案二:

union uFltOrUS16
{
    unsigned __int16 usVal;
    float            fltVal;
};
uFltOrUS16    PLCDataArray2[5000] ;

//Get PLC data and assign to array
  PLCDataArray2[0].usVal     = GetU16ValueFromPLC(addr) ;
  PLCDataArray2[1].fltVal    = GetFloatValueFromPLC(addr) ;
  .
  .
  PLCDataArray2[4999].fltVal = GetFloatValueFromPLC(addr) ;

 //To read back above data as String and show it on form.
 String GetPLCData(unsigned short tid) //tid is plc tag id
 {
     if(plcTags[tid] == 2)
     {
         return IntToStr(PLCDataArray2[tid].usval) ;
     }
     else
     {
         return FloatToStrF(PLCDataArray2[tid].fltval,ffFixed,6,2) ; 
     }
 }

您能否建议我以上哪种类型的解决方案更适合我的问题? 如果以上两者都不好用,请建议我一个更好的实现想法。

谢谢。

最佳答案

您尝试使用 union 执行的操作称为 Type Punning , 并且是 C++ 中的未定义行为:https://stackoverflow.com/a/11996970/2642059

因为 union 经常被滥用,因为基于 union 的类型双关所提供的速度,所以大多数 C++ 编译器确实支持这种行为。 p>

简而言之,如果您打算编写可移植的 符合标准的,您需要使用解决方案1;但是,根据您的编译器,您可能会发现解决方案 2 在您的编译器上是一个更快的解决方案。

关于c++ - (unsigned __int16 to float) 和 float to (unsigned __int16) typecast vs union in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257303/

相关文章:

c - 我是否要转换 malloc 的结果?

c++ - 无法在 C++ 11 中初始化 union

c - C 中 union 内的结构

c++ - 如何使 C++ 模板函数与返回类型无关以供将来专门化

c++ - C++ 中的内联 asm 与 __asm

c++ - 一次迭代 Vector 8 字节并执行按位运算

c++ - 如何在 C++ 中强制转换 void * 指针?

c# - 我无法截屏

C++ union 定义

C++ |语法错误 : Identifier 'i'