数据存储(超全,超详细,零基础也都学的会)

1、基本的内置类型:

2、类型的基本归类:

(1)整形家族:

有符号和无符号的区别在下文中有提到。

(2)浮点型家族:

(3)自定义类型

(4)指针类型:

(5)空类型: 

         通常用于表示函数返回值,函数参数,指针类型(如 void Print(void))

3、整形在内存中的存储

(1)整形有原码,反码和补码三种由二进制表示的形式。

(2)整形数据在内存中是以补码形式存放。

  整形中有符号和无符号的存储有什么不同?

<1> 有符号整形的存储:

(1)原码:最高位代表正负,0为正,1为负;

       如 35 的原码为:00000000000000000000000000100011

          -35 的原码为:10000000000000000000000000100011

(2)反码:正数的反码与原码一样,负数的原码除最高位,所有的位取反

      如 35 的反码为:00000000000000000000000000100011

         -35 的反码为:11111111111111111111111111011100

(3)补码:反码+1

      如 35 的补码为:00000000000000000000000000100011

         -35 的补码为:111111111111111111111111110111001

正数的原码,反码,补码都是一样的

有符号的char型表示范围为-128~127,有符号的int型表示范围为-32768~32767

<2> 无符号类型的存储:

(1)原码:最高位不代表正负,32位均为数据位;

       如 35 的原码为:00000000000000000000000000100011

(2)反码:与原码一样

       如 35 的反码为:00000000000000000000000000100011

(3)补码:与原码一样

       如 35 的补码为:00000000000000000000000000100011

无符号类型的数据的原码,反码,补码均相同(跟有符号数据中的正数很很像)

无符号类型的所有位都表示数据,因此无符号整形的表示范围为 0~4 294 967 295,无符号字符型的表示范围为 0~255

<3>有符号整形进行计算:

28+25

28的原码为0000000000000000000000000000011100

28的反码为0000000000000000000000000000011100

28的补码为0000000000000000000000000000011100

25的原码为0000000000000000000000000000011001

25的反码为0000000000000000000000000000011001

25的补码为0000000000000000000000000000011001

28的补码加上25的补码为0000000000000000000000000000110101

转成十进制则为51

28-25=28+(-25)

28的原码为0000000000000000000000000000011100

28的反码为0000000000000000000000000000011100

28的补码为0000000000000000000000000000011100

-25的原码为1000000000000000000000000000011001

-25的反码为11111111111111111111111111100110

-25的补码为11111111111111111111111111100111

28的补码加上-25的补码为 10000000000000000000000000000000011(33位),int型数据只有32位,去掉第一位,剩下为0000000000000000000000000000000011,转成十进制为3。

4、整形从内存中如何取出

只需将补码还原成原码即可。

有符号数据:

正数:原码反码补码全都一样

负数:补码-1=反码;反码除最高位外,所有位取反得到原码(与存入的过程相反)

无符号数据:原码反码补码全都一样

5、浮点型数据在内存中的存储

根据国际标准IEEE754,任意一个二进制浮点数V可以表示成:(-1)^S*M*2^E

其中S为0或者1,浮点数为正,则S为0,浮点数为负,则S为1;

M表示有效数字,且1\leqM<2

如-5.5 ,  5.5的二进制为101.1,则-5.5可以表示成(-1)^1*1.011*2^2(S=1;M=1.011;E=2)。

float型的存储:

 double型的存储:

对于M的规定:

在存储的过程中,M只存小数部分,如存1.01时,只将01存入M中,不足的位数补0补全,float中M的部分则为01000000000000000000000。

对于E的规定:

E为一个无符号整数,则E中所有的位都是数据位,没有负号位,表示范围为0~255。

并且规定在存E时

单精度浮点数存储时,E=E+127,如float -5.5的E真值为2,存进去的E为129,则E的形式为10000010。

双精度浮点数存储时,E=E+1023;

举个例子

float 5.5存入内存    首先写成二进制形式 101.1     

写成IEEE规定的形式 (-1)^0*1.011*2^2(S=0;M=1.011;E=2)

S=0   M=011 E=2+127=129=10000010

则最终存入的数据为 01000001001100000000000000000000。

6、浮点数从内存中取出

(1)S直接取出

(2)E、M的取出分三种情况:

          <1> E不全为0或1: 此时E=E-127或者 E=E-1023;

            M去掉从左往右数最后一个1后面所有的0,取出后,再在前面加上“1.”,变成“1.xxxxxxxx”。

          <2> E全为0: E=1-127或者E=1-1023;M此时不用加上“1.”,而是还原成“0.xxxxxxxx”。此             时取出的浮点数应该无限趋近于0

          <3>E全为1:取出的浮点数为正无穷或者负无穷

7、大小端字节序存储

什么是大小端?

大端(大端字节序存储):是指数据的低位保存在内存的高地址中,而数据的高位保存在低地址中。

小端(小端字节序存储):是指数据的低位保存在内存的低地址中,而数据的高位保存在高地址中。

如在VS2017中,就是大端存储

int a=0x0000005c

用一个简单的小程序,判断当前机器是以什么字节序存储的


版权声明:本文为yakiyakiya原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。