阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
原码:用两个字节(byte,1字节=8位(bite)),16位表示的二进制整数。
如0的原码:0(或1)000 0000 0000 0000
正整数的原码(如1):0000 0000 0000 0001
负整数的原码(如-1):1000 0000 0000 0001
正整数的原码,最高位是0,负整数的原码最高位是1(计算机中最高位0表示正,1表示-),除最高位外其余各位表示这个整数的绝对值即可;
2.2反码:正整数的反码=原码
负整数的最高位不变还是1,其它位取反(0变1,1变0)就得到负整数的反码了,如-1的反码就是:
1111 1111 1111 1110
2.3补码,补码是cpu内部用来计算数据的:
正整数的补码=原码=反码;
将负整数的原码取它的反码,将它的补码加一就得到负整数的补码了。
如数-1:1000 0000 0000 0001
先取反码得:1111 1111 1111 1110
将反码加1就得到补码:1111 1111 1111 1111
注:计算机内部存储的数都是二进制数的补码形式
负数的位运算:
原负数值->原码->反码->补码->移位=移位后的原码->反码->补码->移位后的数值
//负数的移位运算
//-15 = whyA = 1111 1111 1111 1111 1111 1111 1111 0001
//-15<<2 = whyB = 1111 1111 1111 1111 1111 1111 1100 0100 = -60
//-15>>2 = whyC = 1111 1111 1111 1111 1111 1111 1111 1100 = -4
//--------------------------------------------- //
//whyA的获得
//a、-15 原码 [1000 0000 ... 0000 1111]:最高位是符号位不动,其他和+15一样
//b、-15 反码 [1111 1111 ... 1111 0000]
//c、-15 补码 [1111 1111 ... 1111 0001] = whyA :补码的话如果是1需要进位的,后面也有
//---------------------------------------------
//whyB的获得 //d、-15 左移2位 原码 [1111 1111 ... 1100 0100]:以此为原码
//e、-15 左移2位 反码 [1000 0000 ... 0011 1011]
//f、-15 左移2位 补码 [1000 0000 ... 0011 1100] = -60 = whyB
//---------------------------------------------
//whyC的获得
//d、-15 右移2位 原码 [1111 1111 ... 1111 1100]:以此为原码
//e、-15 右移2位 反码 [1000 0000 ... 0000 0011]
//f、-15 右移2位 补码 [1000 0000 ... 0000 0100] = -4 = whyC
作者:霓裳_慕月
链接:http://www.imooc.com/article/11073
来源:慕课网
转载于:https://www.cnblogs.com/daisy99lijing/p/9751619.html