一>原码,补码,反码
原码:十进制数据的二进制表现形式,最左边是符号位,0为负,1为正
反码:对于正数来说,反码和补码都不变(与原码相同),负数的反码符号位不变,其余为按位取反
补码:正数的补码是其本身,复数的补码是在其反码上+1
二>原码,补码,反码存在的意义
1.原码正数的运算
在计算机内存中,数据都是以二进制的形式存储的,在运算时数据也是以二进制的形式参与的。
拿最常见的数据类型int来说,int在定义变量时向内存申请了4个字节(32个比特位)的大小用来存储数据。举个简单的例子:
int a = 2;
2在内存中以二进制的形式存储32个比特位
现在对2进行加法运算(+1为例)
依此类推我们发现无论是+1,+2,+3,本质上都是对二进制原码的一次次进位,而原码对于正数进行计算是不会有问题的,但是如果用原码对负数进行计算数据就会出现错误。
2.原码的弊端,反码的概念
原码的弊端就是当计算的数据是负数时计算结果就会出错
int b = -4;
//-4的二进制形式:
10000000 00000000 00000000 00000100
//对-4加1
正确结果:-4+1=-3
二进制形式的错误结果:
10000000 00000000 00000000 00000101//实际二进制表现的是-5
不难看出,如果对负数用原码计算所得结果和与其正好相反,而反码就是为了解决原码不能计算负数的问题而出现的。
计算规则:正数的反码不变,符号位不变,其余数位按位取反(1变0,0变1)
利用反码计算负数的结果是完全正确的。
3.补码
虽然反码能够解决负数运算的问题,但是当计算过程中符号位发生变化时就有出现了新的问题。这里方便书写取1个字节。
如图
利用反码计算便符号位时会出现两个0,这也导致后续的计算结果会比实际的结果小1,所以补码规定1111 1111为-1的补码
这样就解决了反码计算时的“跨0”问题。
三>总结
原码是十进制数据的二进制表现形式,但是在负数计算时会出现错误,反码的出现解决了这个问题,而利用反码计算的结果如果跨0,跟实际结果也会有1的偏差,计算机中的存储和运行都是以补码的形式进行的。