例子: 使用(原码、反码、补码的转换)进行数学运算
在计算机中,不存在减法运算,只有加法
比如: 76-32 的运算,在计算机中就是76+(-32)
在二进制的表示中,若为负数,则最高位为1
举个例子: char类型的数据,1个字节 ( 1个字节 = 8位的二进制 )
76 (正数的原码、反码、补码都是一样的)
原码:0100 1100
反码:0100 1100
补码:0100 1100
-32
原码:1010 0000 负数的原码:最高位(符号位)为1
反码:1101 1111 反码:除了符号位其他取反
补码:1110 0000 补码:反码+1 (注意,这里+1是最右边+1,逢2则等于0后,再进1,不是每一位都+1)
运算时,补码相加
0100 1100
1110 0000
---------------- +
1 0010 1100
运算完毕,若最高位有进位,则舍弃最高位。
结果: 0010 1100
该结果为补码相加的结果,然后转为反码,再转为原码,再转十进制 (当然正数的原码、反码、补码都是一样)
所以:
补码: 0010 1100
反码: 0010 1100
原码: 0010 1100
转十进制为 44
所以最后计算结果为: 44
举个例子:
在java中,int类型的数据在内存中占32个字节。
正整数 6 用二进制表示:
0000-0000 0000-0000 0000-0000 0000-0110
负整数 -6 用二进制表示:
1. 对应的正数二进制取反
0000-0000 0000-0000 0000-0000 0000-0110
1111-1111 1111-1111 1111-1111 1111-1001 (取反)
+ 0000-0000 0000-0000 0000-0000 0000-0001 (加1 )
----------------------------------------------------------
1111-1111 1111-1111 1111-1111 1111-1010 (等于 -6 )
当然还有下面这种情况和其他情况:
因为同一个数据,在不同的位数的系统和不同的计算机语言占用的内存不同。(个人见解,可能有误)
1111-1111 1111-1111 1111-1111 1111-1111 1111-1111 1111-1111 1111-1111 1111-1010