原码:最左边为符号位,0为正,1为负
利用原码对负数计算会出现错误
反码:为了解决原码不能计算负数的问题而出现,无法解决负数+正数跨0产生误差的问题
补码:解决了负数计算时跨0的问题,计算机中的存储和计算都是以补码的形式进行的
负数=原数取反+1
反码 | 补码 | |
---|---|---|
正数 | 本身 | 本身 |
负数 | 符号位不变,余位取反 | 在反码基础上+1 |
十进制数字 | 原码 | 反码 |
---|---|---|
-56 | 1011 1000 | 1100 0111 |
-56+1 | 1100 1000 | |
-55 | 1011 0111 | 1100 1000 |
特殊:128,没有原码反码,只有补码1000 0000
强制转换:
public class KV{
public static void main(String args[]){
int a = 300;// 0000 0000 0000 0000 0000 0001 0010 1100
byte b = (byte)a;//0010 1100
System.out.println(b);//44
int c = 200;//0000 0000 0000 0000 0000 0000 1100 1000
byte d= (byte)c;// 1100 1000
System.out.println(d);//-56
}
}
其他运算符
逻辑与&:0为false,1为true
public class KV{
public static void main(String args[]){
int a = 200;
int b = 10;
System.out.println(a&b);//8
System.out.println(a|b);//202
System.out.println(a<<2);//表示座左移两次,低位补0,结果为800//每左移一次就乘以2
System.out.println(a>>2);//表示右移两次,高位补0,符号位补原来符号,结果为50//每右移一次就除以2
System.out.println(a>>>2);//无符号右移,高位补0
}
}