rok*_*rok 4 c pointers casting
为什么以下代码的输出:"我是:1075838976"?
#include <stdio.h>
int main(){
int i = 2;
float num = 2.5;
i = *((int *)& num);
printf("i is: %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
不等于:
#include <stdio.h>
int main(){
int i = 2;
float num = 2.5;
i = num;
printf("i is: %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:"我是2"?谢谢.
Kei*_*son 11
不,它根本不相同.
这个:
i = num;
Run Code Online (Sandbox Code Playgroud)
转换值的num(这是2.5从)float到int.转换将值截断为2.
这个:
i = *((int *)& num);
Run Code Online (Sandbox Code Playgroud)
获取指向float对象的指针num,将其转换为int*,并取消引用生成的指针.
如果你是"幸运的",这会占用构成代表的位num,假装它们代表a int,并为你提供结果.
如果你不"幸运",然后int和float可能是不同大小的,一个float对象可能被错误地对准被视为一个int对象,或者其结果甚至可能是一个"陷阱表示"(尽管后者是罕见的).
(我把"幸运"放在引号中,因为,实际上,这段代码可以做的最好的事情是在你的脸上爆炸,这会立即让你知道你做了一些有问题的事情.行为是未定义的,这意味着它是一个错误,但是无论是在编译时还是在运行时,都不需要实现警告它.)
您获得的特定值1075838976可以用十六进制表示0x40200000.如果查看float系统上表示值的方式,您可以弄清楚该位模式(0100 0000 0010 0000 0000 0000 0000 0000)如何构成表示该值的符号,尾数和指数值2.5.