当num在C中为float时,转换为(&num)的(int*)

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从)floatint.转换将值截断为2.

这个:

i = *((int *)& num);
Run Code Online (Sandbox Code Playgroud)

获取指向float对象的指针num,将其转换为int*,并取消引用生成的指针.

如果你是"幸运的",这会占用构成代表的位num,假装它们代表a int,并为你提供结果.

如果你不"幸运",然后intfloat可能是不同大小的,一个float对象可能被错误地对准被视为一个int对象,或者其结果甚至可能是一个"陷阱表示"(尽管后者是罕见的).

(我把"幸运"放在引号中,因为,实际上,这段代码可以做的最好的事情是在你的脸上爆炸,这会立即让你知道你做了一些有问题的事情.行为是未定义的,这意味着它是一个错误,但是无论是在编译时还是在运行时,都不需要实现警告它.)

您获得的特定值1075838976可以用十六进制表示0x40200000.如果查看float系统上表示值的方式,您可以弄清楚该位模式(0100 0000 0010 0000 0000 0000 0000 0000)如何构成表示该值的符号,尾数和指数值2.5.