为什么以下代码的输出是:1075838976“?
#include <stdio.h>
int main(){
int i = 2;
float num = 2.5;
i = *((int *)& num);
printf("i is: %d\n", i);
}
不等同于:
#include <stdio.h>
int main(){
int i = 2;
float num = 2.5;
i = num;
printf("i is: %d\n", i);
}
哪个输出:“我是2”? 感谢。
答案 0 :(得分:11)
不,它根本不相同。
此:
i = num;
将num
的值(2.5
)从float
转换为int
。转换会将值截断为2
。
此:
i = *((int *)& num);
获取指向float
对象num
的指针,将其转换为int*
,然后取消引用生成的指针。
如果你“幸运”,这会占用构成num
,假装的位,表示它们是int
的代表,并给出你结果。
如果您没有“幸运”,那么int
和float
可能会有不同的尺寸,float
对象可能会被错误地对齐以被视为{{1}对象,或者结果甚至可能是“陷阱表示”(尽管后者很少见)。
(我把“幸运”放在引号中,因为,实际上,这段代码可以做的最佳事情会在你的脸上爆炸,这会立刻让你知道你在做一些有问题的事情。行为是未定义,这意味着它是一个错误,但是在编译时或运行时不需要实现来警告您。)
您获得的特定值int
可以十六进制表示为1075838976
。如果您查找系统上显示0x40200000
值的方式,您可以弄清楚该位模式(float
)如何构成表示值{的符号,尾数和指数值{ {1}}。
答案 1 :(得分:3)
在C中,“cast”有点“重载”,并且完成两件完全不同的事情:
- 导致生成代码以在int
和float
之间转换“标量”值。
- 将指针强制转换为其他类型。这实际上不会生成任何代码,也不会转换任何代码。
((int *)& num)
正在强制指针从float*
到int*
,并且不会进行任何数据转换。
答案 2 :(得分:0)
您告诉机器将二进制数显式解释为int,而不进行强制转换。