我是一名IT学生,今天我参加了C编程考试。 其中一个问题有点令人困惑:是否可以将float *转换为int *? 我说没有你的意见?
答案 0 :(得分:4)
你可以施放,但你不会神奇地获得浮动的整数版本。
发生的事情是你在内存中有一个浮点数然后有一个整数指向同一个位置。但两者的表示方式不同(例如,two's complement vs IEEE 754),结果会得到一个截然不同的整数。
例如:
#include <stdio.h>
int main() {
printf("sizeof(int) = %zu\n", sizeof(int));
printf("sizeof(float) = %zu\n", sizeof(float));
float m = 456.78f;
int *p = (int*)&m;
printf("Float: %f\n", m);
printf("Integer: %d\n", *p);
return 0;
}
在我的系统上,输出:
sizeof(int) = 4
sizeof(float) = 4
Float: 456.779999
Integer: 1139041239
我也会打印他们的尺寸,以强调他们可以也不同。 例如,如果整数碰巧变大,那么你将触摸浮动之外的内存。
虽然这可能不是你想要的,但它有用处。例如,如果要查看特定浮点数的位表示,可以将其转换为uint8_t
,并将其检查到sizeof(float)
。
答案 1 :(得分:2)
为什么不试试呢?
$ cat foo.c
#include <stdio.h>
int main(){
float f = 0.15625;
float *p = &f;
printf("%f\n", *p);
printf("%i\n", *((int *)p));
}
$ gcc foo.c
$ ./a.out
0.156250
1042284544
float
是32位,您可以阅读其代表的含义:http://en.wikipedia.org/wiki/Single-precision_floating-point_format
将float
指针强制转换为int
指针只是告诉C“我指向的数据是int
”。
float
0.156250由二进制0111110001000000000000000000000
表示,表示整数1042284544
。
编辑:@csl打败了我的答案:)