【C语言】浮点数在内存中的存储

本文详细介绍了计算机中浮点数的存储原理,包括单精度(float)和双精度(double)的IEEE754标准,以及如何通过C语言示例展示它们在内存中的符号、指数和尾数部分的存储情况。

简介:

浮点数是计算机中用于表示实数的一种数据类型。在内存中,浮点数的存储遵循IEEE 754标准,其中包括符号位、指数位和尾数位。本文将详细介绍浮点数的内存存储结构,并通过C语言示例进行说明。

正文:

浮点数存储的例子:

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

输出的结果是什么呢?
在这里插入图片描述

浮点数在内存中的存储格式通常采用IEEE 754标准,该标准定义了单精度浮点数(32位)和双精度浮点数(64位)的存储方式。请添加图片描述

1. 单精度浮点数(float)的存储格式:

  • 符号位(1位):用于表示正负号,0表示正数,1表示负数。
  • 指数位(8位):用于表示数值的指数部分。
  • 尾数位(23位):用于表示数值的尾数部分。

下面一段程序展示了浮点数 -3.375 在内存中的存储:

#include <stdio.h>

void printBinary(unsigned int num, int size) {
    printf("        ");
    if (num == 0) {
        printf("0");
        return;
    }

    unsigned int mask = 1 << size - 1;  // 设置掩码,从最高位开始检查

    int count = 1;

    while (mask > 0) {
        if (num & mask) {
            printf("1");
        }
        else {
            printf("0");
        }

        mask >>= 1;  // 右移一位,继续检查下一位

        if (count++ % 4 == 0)
            printf(" ");
    }
    printf(" (2)\n");
}

int main() {
    float num = -3.375;
    unsigned int* ptr = (unsigned int*)&num;

    printf("浮点数: %f (10)\n", num);

    // 获取符号位
    unsigned int sign = (*ptr >> 31) & 1;
    printf("符号位: %u (10)\n", sign);
    printBinary(sign, 1);

    // 获取指数位
    unsigned int exponent = (*ptr >> 23) & 0xFF;
    printf("阶码位: %u (10)\n", exponent);
    printBinary(exponent, 8);

    // 获取尾数位
    unsigned int mantissa = *ptr & 0x7FFFFF;
    printf("尾数位: %u (10)\n", mantissa);
    printBinary(mantissa, 23);

    return 0;
}

在这里插入图片描述
因为是负数符号位就是1,如果正数就是0。
阶码因为是无符号数所以要加上127。
位数要是3375的二进制1.1011,省略调前面一位1不写变成1011 0000 …

2. 双精度浮点数(double)的存储格式:

  • 符号位(1位):用于表示正负号,0表示正数,1表示负数。
  • 指数位(11位):用于表示数值的指数部分。
  • 尾数位(52位):用于表示数值的尾数部分。
  • #include <stdio.h>
void printBinary(unsigned long long num, int size) {
    printf("        ");
    if (num == 0) {
        printf("0");
        return;
    }

    unsigned long long mask = 1ULL << size - 1;  // 设置掩码,从最高位开始检查

    while (mask > 0) {
        if (num & mask) {
            printf("1");
        }
        else {
            printf("0");
        }

        mask >>= 1;  // 右移一位,继续检查下一位
    }
    printf(" (2)\n");
}

int main() {
    double num = -3.375;
    unsigned long long* ptr = (unsigned long long*)&num;

    printf("浮点数: %lf (10)\n", num);

    // 获取符号位
    unsigned long long sign = (*ptr >> 63) & 1;
    printf("符号位: %llu (10)\n", sign);
    printBinary(sign, 1);

    // 获取指数位
    unsigned long long exponent = (*ptr >> 52) & 0x7FF;
    printf("阶码位: %llu (10)\n", exponent);
    printBinary(exponent, 11);

    // 获取尾数位
    unsigned long long mantissa = *ptr & 0xFFFFFFFFFFFFFull;
    printf("尾数位: %llu (10)\n", mantissa);
    printBinary(mantissa, 52);

    return 0;
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_hd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值