我有一个32位长整数数组。之后,一些元素将用作32位浮点数。我想提供一个初始化列表来正确初始化这些浮点值。例如,如果前两个元素用作整数,第三个元素用作float,并且我希望将第三个元素初始化为等于100.0,我不得不这样做:
long a[3]={10,20,0x42c80000};
这很好用,但表现力不强。
如果我这样做:
long a[3]={10,20,100.0};
编译器会将浮点文字转换为0x64。
我没有C ++ 11编译器,因此使用union不起作用。
有什么想法吗?
答案 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
// ...
};