二进制补码以及为什么要使用补码
- 计算机系统的内部以二进制形式存储数据。
- 在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。
补码规则
- 在计算机系统中,数值一律用二进制的补码来存储。
- 二进制的最高位是符号位,0表示正数,1表示负数。
- 正数的值是其本身,负数的值是最高位(符号位)不变,其它位逐位取反,再加1。
- 两数相加,若最高位(符号位)有进位,则进位被舍弃。 例如: 4位二进制补码中,5-3的结果是2
(1101)2 //2是二进制的意思 0010 //逐位取反 0011 // 加1 (1101)2 = -3
补码运算的特征
- 计算机中正数和负数的关系是取反加一。 【示例】在四位二进制数中,已知3的二进制值是0011,若要求-3,则 0011 3 1100 逐位取反 1101 +1
- 补码运算是封闭的: 运算结果保留在补码范围之内, 超范围就溢出。 【示例】四位二进制的补码运算中,请计算5+4的结果。 结果为:-7
- 4位二进制补码最多能表示24=16个数,数的范围是-8~7
- 8位二进制补码最多能表示28=256个数,数的范围是 -128~127
补码运算的原理
“正数+负数=模”。 模:某种类型数据的总数,例如: 4位二进制数的模是24=16 8位二进制数的模是28=256
为什么要使用补码?
下面的故事都是我瞎编的~~ 计算机专业的人你懂得,大家都不想重复造车轮。搞出来加法电路以后,就在大家一筹莫展想怎么搞个减法的电路的时候,我的女儿(好吧,我没有)拿着一道数学题找到了我,5+(-2)=?,我惊奇的发现,减法和加法之间似乎有着某种py交易。 所以我们是不是可以用加法电路就可以完成减法的运算呢? 每当老师上课的时候提出这种设问,答案往往是肯定的(23333) 咱们首先画个大饼,就是公司画给咱们的那种。 比如5-3=2。我们发现,5往后面退后3个格子就可以得到2这个结果,但是没有注意到的是,5往前面走7个格子也可以得到2这个结果,但是这个7和3有什么必然的联系吗?在这个饼里面他的模是10!3+7=模! 所以5-3=2在计算机的算法就应该是下面的过程: (-3)2=011 (-3)补=001 这里我们舍掉最高位就是结果2。实际上,因为这里是3位二进制数,110对应的10进制数为6,6+2=8,所以其实如果写成4个二进制数,就是 0101+1101=0010 ,8位二进制的话,就是00000101+11111101=10000010结果仍然是2