gpt4 book ai didi

c - 为什么通过强制转换重新解释的 C 内存字段在常规强制转换和通过指针强制转换之间有所不同?

转载 作者:行者123 更新时间:2023-12-04 15:27:52 25 4
gpt4 key购买 nike

我写了这样的代码示例:

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

这是什么原因?对不起,如果很明显。

最佳答案

j = (int)f;

这会获取 f,并以某种方式将其转换为整数值。

i = *(int *)(&f);

这是 f地址,并告诉编译器“这是一个整数”,然后将其值存储到 i 中。

第二种形式使用原始位,没有考虑 double 在内存中的表示与整数不同。

编辑

正如 Christian Gibbons 所指出的,这种通过不同类型的指针访问对象的方式是 undefined behavior ,这意味着您的应用可能会做各种意想不到的事情,即使运行良好 ;)

关于c - 为什么通过强制转换重新解释的 C 内存字段在常规强制转换和通过指针强制转换之间有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61899233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com