【发布时间】:2020-09-06 00:01:36
【问题描述】:
我写了这样的代码示例:
int main(void) {
double f = 0.1;
int i, j;
i = *(int *)(&f);
j = (int)f;
printf("%d\n%d\n", i, j);
return 0;
}
我预计结果会是一样的。因为我认为通常这些是相同的事情:将一种类型的数据重新解释为另一种类型的数据并获取一种类型的指针,将其转换为另一种类型的指针,然后访问数据。但我得到了:
-1717986918
0
是什么原因?对不起,如果很明显。
【问题讨论】:
-
i被强制通过指针转换来解释f,就好像它是一个int,但事实并非如此。它甚至不是相同的size。j是f的简单赋值,它被截断为0,并且强制转换抑制了关于失去意义的编译器警告。 -
根据@WeatherVane 所说的,
i是一种严格混叠违规,会导致未定义的行为。
标签: c casting reinterpret-cast