联合中由int数据类型(低,高)结构表示的双精度数据类型

时间:2012-11-12 21:25:26

标签: c++

以下是有效的陈述吗?我知道字节顺序,这是一个Windows环境。如果我定义Int32Double myVar;如果myVar.int32.low是计算值,则myVar.d总是相同的吗? E.G:myVar.d = 0.4 * log(4); printf("%08X\n", myVar.int32.low);

union Int32Double
{
    struct
    {
        int low;
        int high;
    } int32;

    double d;
};

2 个答案:

答案 0 :(得分:3)

不,这是未定义的行为写入d并从int32读取。

答案 1 :(得分:2)

首先,整数类型和浮点类型的对象表示通常非常不同。将double对象的任何部分重新解释为int对象通常不会产生任何类似于原始double值的值。结果没有意义,除非你真的知道你在做什么。如果一个人知道自己在做什么,就会使用 unsigned 整数类型进行重新解释。

其次,在C ++中使用联合进行内存重新解释是非法的。它导致未定义的行为。 C99规范的最新技术勘误之一实际上使其在C语言中合法(当然,具有实现定义的行为,并且只要我们不尝试访问陷阱表示)。但是AFAIK还没有用C ++。因此,使用风险自负。

P.S。我不确定你的意思是“永远都是一样的”......