参考:
https://www.cnblogs.com/bude/p/6304520.html
https://zh.wikipedia.org/wiki/%E5%8E%9F%E7%A0%81
一:原码:
原码:指二进制左边加上符号后得到的码
当二进制数大于0时,符号位为0;
二进制数小于0时,符号位为1;
二进制数等于0时,符号位可以为0或1(+0/-0)
二:反码
正数的反码为其本身
负数的反码符号位不变,其他位取反
三:补码
正数的反码,补码,皆为其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
四:0的补码
正0:00000000 补码还是00000000
负0:10000000 取反11111111 加1 00000000
所以0的补码还是0
五:补码的意义
使用补码的意义:使用补码可以把减法变为加法,方便计算机计算,这是使用补码的原因:
补码的原理:同余计算
参考:https://www.zhihu.com/question/21511392/answer/83082631
比如 01111111 这个数要减00000001(即加上10000001),如果想用加法的方式要怎么做到呢
答案就是01111111+(11111111)= 011111110,可以看到,这样把负数换成补码后进行加法运算得到的计算结果和直接减去是一样的,这个就是补码的意义。
对于一个数a 其加上一个负数(b)最后的结果和其加上它的补码最后的结果是一样的。(网上通用的例子是拿时钟做比喻,12点加上三点和其减去九点,其时钟所指的位置是一样的)
六:关于java中的Integer.toBinaryString
这个方法最后打印出来的String其实是补码
Log.i(TAG,"-32: "+Integer.toBinaryString(-32));
Log.i(TAG,"32: "+Integer.toBinaryString(32));
2019-06-08 11:13:54.840 913-913/calc.superdy.ttest I/TestService: -32: 11111111111111111111111111100000
2019-06-08 11:13:54.841 913-913/calc.superdy.ttest I/TestService: 32: 100000