Sub*_*ndi 1 c floating-point casting
int x=25,i;
float *p=(float *)&x;
printf("%f\n",*p);
Run Code Online (Sandbox Code Playgroud)
我理解浮点数和int的位表示是不同的,但无论我存储什么值,答案总是0.000000.根据浮点表示,它不应该是其他值吗?
您的代码是未定义行为-但正如你期望的那样,只要规模和类型的对齐它很可能会表现int和float兼容.
通过使用"%f"格式进行打印*p,您将丢失大量信息.
试试这个:
#include <stdio.h>
int main(void) {
int x = 25;
float *p = (float*)&x;
printf("%g\n", *p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上(可能在你的系统上),它打印:
3.50325e-44
Run Code Online (Sandbox Code Playgroud)
该int值25在其大多数高位中都为零.这些位可能与类型的指数字段位于同一位置float- 导致数字非常小.
查找IEEE浮点表示以获取更多信息.字节顺序将是一个问题.(除非你有没有做这种事情在实际的代码非常充足的理由.)
正如rici在评论中所建议的,学习浮点表示的更好方法是从浮点值开始,将其转换为相同大小的无符号整数,并以十六进制显示整数值.例如:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void show(float f) {
unsigned int rep;
memcpy(&rep, &f, sizeof rep);
printf("%g --> 0x%08x\n", f, rep);
}
int main(void) {
if (sizeof (float) != sizeof (unsigned int)) {
fprintf(stderr, "Size mismatch\n");
exit(EXIT_FAILURE);
}
show(0.0);
show(1.0);
show(1.0/3.0);
show(-12.34e5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)