4

为什么会输出以下代码:“i is: 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);
} 

哪个输出:“i is 2”?谢谢。

4

3 回答 3

11

不,它根本不等同。

这个:

i = num;

将(which is )的从转换为。转换将值截断为。num2.5floatint2

这个:

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

获取一个指向floatobject的指针num,将其转换为int*,并取消引用结果指针。

如果您“幸运”,这将获取构成 的表示的位num假装它们是 a 的表示int,并为您提供结果。

如果你不是“幸运”,那么int并且float可能大小不同,一个float对象可能被错误地对齐以被视为一个int对象,或者结果甚至可能是一个“陷阱表示”(尽管后者很少见)。

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

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

于 2013-07-23T15:25:45.450 回答
3

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

-- 导致生成代码以在int和之间转换“标量”值float

-- 强制一个指向不同类型的指针。这实际上不会生成任何代码,也不会转换任何内容。

((int *)& num)float*强制指向to的指针int*,并且不进行任何数据转换。

于 2013-07-23T15:30:30.153 回答
0

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

于 2013-07-23T15:24:05.810 回答