在C ++中使用浮点文字初始化整数数组的成员

时间:2016-09-06 09:28:37

标签: c++ arrays initializer-list

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

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

这很好用,但表现力不强。

如果我这样做:

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

编译器会将浮点文字转换为0x64。

我没有C ++ 11编译器,因此使用union不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

工会不需要C ++ 11,所以请继续使用它们。然而,如果它们不是在语义上属于一起,则在单个数据结构中混合不同类型的对象/元素通常是个坏主意。

它将使您的代码操纵所述数据结构变得脆弱且容易出错。我建议重新思考你的语义,看看为什么你需要同一个数组中的long和float。它们可以存储在单独的数据结构中。浮点数也可以准确地存储所有长整数(尽管具有不同的按位表示),那么为什么不创建一个浮点数组呢?

答案 1 :(得分:1)

当你将它分配给长数组时,你正在做什么,它将进行隐式转换。如果要将字节值存储在变量中,可以使用memcpy

所以你能做什么(并注意这是非常危险以防你的类型大小不一样)有这样的功能

long toLongRepresantation(float f)
{
   long ret;
   memcpy(&ret,&f,sizeof(long));
   return ret;
}

您也可以对此进行模板处理,但应确保两种类型的大小相同。

答案 2 :(得分:0)

为什么你不使用struct或class?

struck a
{
    int    iValue1; 
    float  fValue1;
    double dValue1;
    char   cValue1;

    int    iValue2[10]; // array of ints
    float  fValue2[5 ]; // array of floats
    // ...
};