计算机中的数字分为无符号数字和有符号数字。无符号数字对应的二进制位全部位都用来表示数,无符号数字就是正数,其在内存的表示的形式就是其对应的二进制。而对于有符号数字在内存中表示至关麻烦,由于其对应的二进制位中最高位要用来表示数字的正负(最高位为1时为负数,为0时表示正数),并不能全部位全用来表示数字。设计
无符号数字,由于其全部二进制位都能用来表示数字,因此对于单字节的二进制位能够表示无符号数的范围区间是[0,255],共256个数字。在计算机内存中,直接用无符号数对应的二进制来表示无符号数是符合逻辑的。内存
有符号数字,由于最高位要用来表示数字的正负,全部并不能用其对应的全部二进制位来表示数字。对于单字节的二进制位1111 1111表示为最小数-127,二进制位0111 1111表示最大数127。所以对于单字节的二进制位能够表示有符号数的范围区间是[-127,127],共255个数字,其中二进制位1000 0000表示负0,二进制位0000 0000表示正0。若是这样直接用有符号数对应的二进制在内存中表示这些数就不符合逻辑了,由于无符号数要表示256个,一样有符号也要表示256个数字。若是把1000 0000表示的负0分为-128,正好能够变有符号数的范围为[-128,127],这样就能和无符号数表示范围对应上了。若是这样的话,硬件CPU在处理数据时,-127+(-1)=负127的二进制+负1的二进制=1111 1111 + 1000 0001 = 1 0000 0000, 单字符溢出后变为0000 0000表示正0,并非1000 000表示的-128;若是非要这么操做,就要增长CPU设计难度,由于计算机最适合处理有规律的计算。因此这种直接用二进制在内存中表示有符号数字的方法明显不能应用,会给硬件CPU设计带来难度。数学
计算机的有原码,反码和补码。这些二进制位的操做是为了解决有符号数字在内存中表示方式不足的。原码就是数字自己对应的二进制,反码就是在原码的基础上符号位不变其他位取反,补码是在反码的基础上加1一个二进制位。基础
无符号数字,能够直接使用其对应的二进制来表示内存中的形式,都是正数。因此规定正数原码,反码和补码都是其二进制自己。硬件
有符号数字,不能够直接使用其对应的二进制来表示内存中的形式,因此要引用原码,反码和补码之间的关系来解决这个问题。-127对应的原码是其二进制1111 1111,反码是1000 0000,补码是1000 0001;127正数原码,反码和补码都是其二进制自己,为0111 1111;把0划给正数时原码,反码和补码都是其二进制自己0000 0000;把0划给负数时原码1000 0000,反码1111 1111,补码1 0000 0000;由于对于数学逻辑而言,并无正0和负0之分,0既不是正数也不是负数,因此把0000 0000表示的正0定义为0,把1000 0000表示的负0表示为负128的补码。这样对于设计CPU而言也能够减小困难,由于计算机中并无减法,减法用加上一个数的负数表示。例如-127+(-1) = 负127内存补码 + 负1内存补码 = 1000 0001 + 1111 1111 = 1 0000 0000=负0的补码 = 规定的负128的补码(所以-128只有规定的补码,并没有对应的原码)。这样就能解决硬件CPU设计上的困难;再例如127-1=127内存补码 + 负1的内存补码=0111 1111 + 1111 1111 = 1 0111 1110 = 0111 1110(舍去最高位)=126。引用
想要理解上面内容要先复习一下二进制的数学运算,适当了解一下内存的单位字节。二进制