简介:
浮点数是计算机中用于表示实数的一种数据类型。在内存中,浮点数的存储遵循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*)#
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*)#
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;
}


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

被折叠的 条评论
为什么被折叠?



