一.以补码的形式存储在内存当中
1.有符号型的整数二进制首位0表示正,1表示负数;
2.正数的原码、反码、补码都相同,如:
3.负数的反码为原码的首位数不变,其他位按位取反所得,补码为反码+1,如:
当然,要得到负数的原码,可以反过来,即补码-1再取反,也可以和原码转补码那样用补码取反+1,这种转换往往更加轻松。
二.大端存储和小端存储
1.大端存储:把一个数据的低位字节内容存放在高地址处,高位字节的内容存放在低地址处;
2.小端存储:把一个数据的高位字节内容存放在高地址处,低位字节的内容存放在低地址处;
3.举例:
图中从上往下和从左往右看内存为由低到高的地址,a的值为0x00 00 00 14,在图中却倒着存储。
其中,0x14为一个字节,同时也是a的最低位字节,将它存储在了低地址处,而其他的 00 00 00其实也按顺序一步步存储了进去,所以我们按顺序看为0x14 00 00 00,是反过来了的。
如果用的是用大端存储的话,得到的结果则与小端存储相反。
三.用补码来存储数据的原因
首先我们得理解一个概念:C语言中CPU计算只有加法。就算是简单的1-1也要转换成1+(-1)的形式,仔细一想,如果我们都用原码相加,结果如下:
10000000000000000000000000000001(-1原码)+
00000000000000000000000000000001( 1原码)=10000000000000000000000000000010
那么得到的将会是一些奇奇怪怪的数字,而如果以补码的方式来计算:
11111111111111111111111111111111(-1补码)+
00000000000000000000000000000001( 1补码)=1 00000000000000000000000000000000
(此时由于数值溢出,使得最高位的1溢出丢失)
以补码的形式则可以避免这种情况,做到只用加法也能进行加减乘除的运算,以便减轻硬件的负担。