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

时间:2013-07-23 15:22:13

标签: 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);
} 

不等同于:

#include <stdio.h>

int main(){
  int i = 2;
  float num = 2.5;

  i = num;
  printf("i is: %d\n", i);
} 

哪个输出:“我是2”? 感谢。

3 个答案:

答案 0 :(得分:11)

不,它根本不相同。

此:

i = num;

num2.5)从float转换为int。转换会将值截断为2

此:

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

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

如果你“幸运”,这会占用构成num假装的位,表示它们是int的代表,并给出你结果。

如果您没有“幸运”,那么intfloat可能会有不同的尺寸,float对象可能会被错误地对齐以被视为{{1}对象,或者结果甚至可能是“陷阱表示”(尽管后者很少见)。

(我把“幸运”放在引号中,因为,实际上,这段代码可以做的最佳事情会在你的脸上爆炸,这会立刻让你知道你在做一些有问题的事情。行为是未定义,这意味着它是一个错误,但是在编译时或运行时不需要实现来警告您。)

您获得的特定值int可以十六进制表示为1075838976。如果您查找系统上显示0x40200000值的方式,您可以弄清楚该位模式(float)如何构成表示值{的符号,尾数和指数值{ {1}}。

答案 1 :(得分:3)

在C中,“cast”有点“重载”,并且完成两件完全不同的事情:

- 导致生成代码以在intfloat之间转换“标量”值。

- 将指针强制转换为其他类型。这实际上不会生成任何代码,也不会转换任何代码。

((int *)& num)正在强制指针从float*int*,并且不会进行任何数据转换。

答案 2 :(得分:0)

您告诉机器将二进制数显式解释为int,而不进行强制转换。