这是基础的概念问题,但有些东西令我很气愤,比如有人说反码就是逐位取反,这种误人子弟的话,确实令我很气愤。我结合自己的学习概括如下,希望对有需要的朋友有所帮助。
首先我们的数分为有符号数和无符号数两类,有符号数分为正数和负数两类,无符号数全是正数,有符号数的最高位为符号位,0为正,1为负,除掉最高位的符号位以外的数字代表着我们所谓的值域,而无符号数所有数字全是值域。
针对正数,采用除二取余,逆序排列求得原码,正数的反码,补码与原码相同;
针对负数,其`补码`等于对其绝对值先二进制表示,再逐位取反,最后低位加1而成(加1的时候有进位的就进位),补码的补码就是原码,求反码为原码符号位不变,其余位逐位取反,补码为反码低位加1。
正负数求反码方式都不一样,又怎么会来反码就是逐位取反这种滑稽之谈呢?甚至还有人说负数的二进制表示是补码+1,这种说法更是莫名其妙,谁的补码?哪里来的+1?
规则说到这里就完了,如果你想知道Java里面怎么处理的,你可以往下看。
结合Java语言,做个实际说明,我声明 int a = 20, 在Java中,int类型占4个byte,即32bit,即用32位二进制表示,则20的原码为00000000000000000000000000010100,其中最左边的那个0为符号位,剩余的26个0加上10100为值域,合起来意思就是正的20,那么-20的原码是多少呢,按照负数求原码的规则,该是11111111111111111111111111101100,最高位为1,代表为负数。但是给你这么个二进制数11111111111111111111111111101100,怎么知道它的十进制表示多少呢?首先,这是java的int型,属于有符号数(你需要知道,java里面的数字类型全是有符号数),读取最高位符号位1,代表负数,按照求负数原码的方式逆着操作就可以找出这个负数对应的绝对值了,先减1,得11111111111111111111111111101011然后逐位取反,得到00000000000000000000000000010100,这是个正数,代表这20,所以加起来这是负数的20,即-20。