以下是有效的陈述吗?我知道字节顺序,这是一个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;
};
答案 0 :(得分:3)
不,这是未定义的行为写入d
并从int32
读取。
答案 1 :(得分:2)
首先,整数类型和浮点类型的对象表示通常非常不同。将double
对象的任何部分重新解释为int
对象通常不会产生任何类似于原始double
值的值。结果没有意义,除非你真的知道你在做什么。如果一个人知道自己在做什么,就会使用 unsigned 整数类型进行重新解释。
其次,在C ++中使用联合进行内存重新解释是非法的。它导致未定义的行为。 C99规范的最新技术勘误之一实际上使其在C语言中合法(当然,具有实现定义的行为,并且只要我们不尝试访问陷阱表示)。但是AFAIK还没有用C ++。因此,使用风险自负。
P.S。我不确定你的意思是“永远都是一样的”......