首页 > 解决方案 > 联合与价值

问题描述

#include<stdio.h>
typedef union{
    char a;
    double num;
}uni;
int main(){
    uni name;
    name.num=5.8234;
    printf("%lf\n",name.num);
    name.a='b';
    printf("%lf %c\n",name.num,name.a);
    printf("\n");

}

为什么双数值保持不变?

输出:

5.823400
5.823400 b

标签: c

解决方案


假设您的系统对 a 使用 IEEE754 双精度浮点格式double,则表示num包含 1 个符号位,后跟 11 位代表指数,后跟 52 位代表尾数。还假设您的系统使用 little-endian 字节排序,char联合doublea

您看不到区别,因为%f默认情况下仅显示 6 个十进制数字,而double具有此表示的 a 具有大约 16 个有效十进制数字。

如果您将格式说明符更改为,%.16f您将看到不同之处。

5.8234000000000004
5.8234000000000794 b

推荐阅读