指针类型转换为不同的数据类型

时间:2016-10-19 19:06:11

标签: c pointers casting

(float*)在g的情况下特别做了什么。如果我写g = *&i;那么ouptut是正常的,即g = f,但是如果g = *(float*)&i;那么为什么g = 0.0000 ???

#include <stdio.h>

int main()
{

int i = 37;
int *p;
p = &i;
float f = i;
printf("%d\n", i);
printf("%d\n", p);
printf("%d\n", *p);
float g = *(float*) &i;
printf("i = %d   f = %f   g = %f", i, f, g);
}

2 个答案:

答案 0 :(得分:0)

在行中:

g = *&i;

运算符*&互相取消,结果就好像代码是:

g = i;

该行:

float g = *(float*) &i;

导致未定义的行为,因为int和float类型不兼容。

您看到的结果是由未定义的行为引起的,尽管在您的情况下行为是相对良性的。会发生的是,int类型的变量位被重新解释,就好像它是float类型一样。

通过指针进行转换不是解释其他类型位的正确方法。

答案 1 :(得分:0)

g = *&ig = i相同,并将int赋值给float。编译器通过=运算符执行转换:

  1. 加载整数,2。转换为浮点格式,3。存储在float中。除了四舍五入的问题之外,它的作用非常好。
  2. 另一种结构是重新解释指向浮点指针的整数指针。由于浮点数的数据格式不同(浮点数通常使用一些位用于尾数,一些位用于指数),对于整数(整数只是序列化为内存8位乘8位),编译器只是将数据从源复制到目的地没有任何额外的转换,你没有得到你想要的。