浮点表示问题

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.根据浮点表示,它不应该是其他值吗?

Kei*_*son 6

您的代码是未定义行为-但正如你期望的那样,只要规模和类型的对齐它很可能会表现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)