在c++中使用浮点字面值初始化整型数组的成员

Initializing a member of an integer array with a floating point literal in C++

本文关键字:整型 初始化 数组 成员 字面值 c++      更新时间:2023-10-16

我有一个32位长整数数组。之后,其中一些元素将被用作32位浮点数。我想提供一个初始化列表来正确初始化这些浮点值。例如,如果前两个元素用作整数,第三个元素用作浮点数,并且我希望将第三个元素初始化为等于100.0,则必须这样做:

long a[3]={10,20,0x42c80000};

这个可以正常工作,但是不是很有表现力。

如果我这样做:

long a[3]={10,20,100.0};

编译器将浮点字面值转换为0x64。

我没有c++ 11编译器,所以使用联合是行不通的。

任何想法?

union不需要c++ 11,所以继续使用它们吧。但是,如果不同类型的对象/元素在语义上不属于一起,那么在单个数据结构中混合它们通常不是一个好主意。

它将使您用于操作所述数据结构的代码脆弱且容易出错。我建议重新考虑你的语义,看看为什么你需要长和浮点数在同一个数组。它们可以存储在单独的数据结构中。此外,浮点数可以准确地存储所有的long(尽管使用不同的位表示),所以为什么不直接创建一个浮点数数组来开始呢?

当你将它赋值给长数组时,它将进行隐式转换。如果你想将字节值存储在变量中,你可以使用memcpy

所以你能做的(注意这是非常危险的,如果你的类型大小不一样的话)有一个像这样的函数
long toLongRepresantation(float f)
{
   long ret;
   memcpy(&ret,&f,sizeof(long));
   return ret;
}

你也可以创建这个模板,但你应该确保这两个类型的大小是相同的

为什么不使用struct或class呢?

struck a
{
    int    iValue1; 
    float  fValue1;
    double dValue1;
    char   cValue1;
    int    iValue2[10]; // array of ints
    float  fValue2[5 ]; // array of floats
    // ...
};