在C语言中,数据在内存中的存储并不是每个数字都是精确储存,有些浮点数会采用约等于的方式存储,接下来我们就来讲讲在计算机内存存储中整数和浮点数的区别。
首先整数在内存中的时使用二进制的方式存储,整数二进制有三种表示方法,即原码、反码和补码。
三种方式第一个位置称为符号位,0表示“正”,1表示“负”。除第一个符号位以外,剩下的均是数值位。
那么原码、反码和补码是什么呢?
原码:直接将数值按照正负数的形式翻译成二进制。
反码:将原码的符号位不变,其他数值位一次取反。
补码:反码基础上+1得到补码。
浮点数在内存中的存储相对整数来说稍微麻烦一点点
#include <stdio.h>
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;
}
这个代码可以充分的说明浮点数和整数在内存中存储的区别。
我们存进整数,强制转换为浮点数取出,这里得到的结果则为0.000000,以浮点数存入9.0,使用整数取出拿到的则是1091567616。
接下来我们就详细的讲一下浮点数在内存中是如何存放的:
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1)^S * M * 2^E
• (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2^E 表⽰指数位
举例来说:
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M.
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
float类型的浮点数储存:
double类型的浮点数储存:
在内存空间中按照相应的比特位存储。