一.原码
1.正数的原码就是它的本身
假设使用一个字节存储整数,整数10的原码是:0000 1010
2.负数用最高位是1表示负数
假设使用一个字节存储整数,整数-10的原码是:1000 1010
二.反码
1.正数的反码跟原码一样
假设使用一个字节存储整数,整数10的反码是:0000 1010
2.负数的反码是符号位为1,其他位取反(0变1,1变0)
假设使用一个字节存储整数,整数-10的反码是:1111 0101
三.补码(强调:数字的存储在计算机中才是补码形式)
1.正数的补码和原码一样
假设使用一个字节存储整数,整数10的补码是:0000 1010
2.负数的补码是符号位为1,其他为取反后加1,即负数的反码加1
假设使用一个字节存储整数,整数-10的补码是:1111 0110
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
位移运算:
java中byte、short、int做位运算(>>、<<、&、^...)时,先将原始数据扩展为4个字节(转int),再做运算。如:
#byte为-1的值存储为11111110
byte b = -1;
byte bb = b << 1;
算法步骤如下:
1)、变量b为-1,原为一个字节11111110;
2)、b扩展为四个字节(即转int)后为int类型的-1,即11111111 11111111 11111111 11111110;
3)、整体向左移动1位,左边超出部分舍弃,右边新增为0;
4)、判断最后值是否大于byte能接收最大值,大于正数或负数最大值时提示强制转换(强制截取后面8位),否则直接截取后面8位适配;
注意
>>类运算时,右边超出位舍弃,左边若为1,即补相应位数1(正负数本质不变),若为0即补相应位数0;
<<类运算时,左边超出位舍弃,右边补0;