前面的学习我们可能见过char、short (int)、int、long (int)、long long、float、double这些定义变量时所使用的内置类型,那么它们到底有什么用呢?
char //字符数据类型 在内存中开辟1个字节的空间大小
short //短整型 在内存中开辟4个字节的空间大小
int //整形 在内存中开辟4个字节的空间大小
long //长整型 在内存中开辟4/8个字节的空间大小
long long //更长的整形 在内存中开辟8个字节的空间大小
float //单精度浮点数 在内存中开辟4个字节的空间大小
double //双精度浮点数 在内存中开辟1个字节的空间大小
当我们在定义变量的时候我们要根据变量的类型和大小来合理的使用这些内置类型
变量又基本分为字符和整形,定义字符时往往使用char,而整形又分为整数和浮点数,这些就要依情况而定了。
那么下面我就来说说整数和浮点数在计算机中是怎样存储的
首先我们得知道计算机是二进制机器,它只能认识0和1,我们生活中往往使用的是十进制,而计算机就需要将十进制转化为二进制,然后以补码的形式存储,那么什么又是补码呢?
要想知道什么是补码,就得先知道什么是原码和反码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位 正数的原、反、补码都相同。
原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码
将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码
反码+1就得到补码。
一般整形在计算机中都是以补码的形式存储
浮点数在计算机中又是怎样存储的呢?
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。
举个例子来说:
十进制的6.0,写成二进制是110.0,相当于1.1*2^2
按照上面的格式,可以得出S = 0,M = 1.1,E = 2。
IEEE 754规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
这里有一点不同E存储的时候往往需要加上一个特定的数字,这里加的是127
而M部分存储的时候,因为M大于等于1小于2,所以为了节省一位有效数字,只是将小数点后面的数字存储进去,当需要拿出它的时候,前面只需加上一个1。
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
这里E需要加上1023
举一个例子:
十进制9.0用在计算机中二进制表示为1001,用IEEE表示为(-1)^0*1.001*2^3
S=0,M=1.001,E=3(记住E要加127)
在计算机中就是这样存储的
0 10000010 00100000000000000000000(这里空格是为了看的更清楚)
所以他的地址为0100 0001 0001 0000 --> 0x 41100000
而因为一般我们的计算机都是小端字节序,所以存储的就是00 00 10 41
那么就谢谢大家的观看