当num在C中浮动时,强制转换为(&;num)的(int*)

当num在C中浮动时,强制转换为(&;num)的(int*),c,pointers,casting,C,Pointers,Casting,为什么以下代码的输出是:“i is:1075838976” #包括 int main(){ int i=2; 浮点数=2.5; i=*((int*)和num); printf(“i是:%d\n”,i); } 这不等于: #include <stdio.h> int main(){ int i = 2; float num = 2.5; i = num; printf("i is: %d\n", i); } #包括 int main(){ int i=2;

为什么以下代码的输出是:“i is:1075838976”

#包括
int main(){
int i=2;
浮点数=2.5;
i=*((int*)和num);
printf(“i是:%d\n”,i);
} 
这不等于:

#include <stdio.h>

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

  i = num;
  printf("i is: %d\n", i);
} 
#包括
int main(){
int i=2;
浮点数=2.5;
i=num;
printf(“i是:%d\n”,i);
} 
哪个输出:“我是2”?
谢谢。

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

不,它根本不等效

这:

num
(即
2.5
)的值从
float
转换为
int
。转换将值截断为
2

这:

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

如果你“幸运”,这将取组成
num
表示的位,假装它们是
int
的表示,并给出结果

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

(我在引号中加上了“lucky”,因为实际上,这段代码能做的最好的事情就是当面爆炸,这会立即让你知道你在做有问题的事情。行为是未定义的,这意味着这是一个错误,但实现不需要在编译时或运行时警告你。)

您得到的特定值,
1075838976
,可以用十六进制表示为
0x40200000
。如果您查找系统上表示值的方式,您可能会发现位模式(
0100 0000 0010 0000
)是如何构成符号、尾数和指数值的,这些值在C“cast”中表示值
2.5

,有点“重载”做两件完全不同的事情:

--使生成的代码在
int
float
之间转换“标量”值

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


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

不,它(显然)不等效。一个重新解释位模式(调用途中未定义的行为),另一个执行值转换。高度相关,甚至可能重复:
#include <stdio.h>

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

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