位运算和浮点数的简单思考
/**
* 负数的位运算,先求补码进行位运算,计算完毕后若 符号位高位仍为负数,就再求补码
*
* 浮点数的表示是 (-1)^s * M * 2^E
* 32位的浮点数,最高位是符号位S,接着11位是指数E,剩下的8位为M
* 64位的浮点数,最高位是符号位S,接着11位是指数E,剩下的52位位M
* 精度不一致,这也就导致了float转换成double类型后结果可能会不一样的情况
*
* 例如 10.5 二进制为 1010.1 相当于 1.0101*2^3 (左移三位) 则 符号位s为0,M为1.0101,E为3
*/
public static void main(String[] args) throws Exception{
// 左移(<<) 低位补0 相当于做乘法
System.out.println( << );// 运行结果是60
System.out.println(- << ); //运行结果是-60
// 右移(>>) 高位补符号位
System.out.println( >> );// 运行结果是2
System.out.println(- >> );//运行结果是-2
// 3、无符号右移( >>> ) 高位补0
System.out.println( >> );// 结果是1
System.out.println(- >> );// 结果是-2
System.out.println(- >>> );// 结果是536870910
float a = f; //对于单精度 二进制表示 尾数只能表示23位的精度
double b = (double)a; //对于双精度 二进制表示 尾数表示的位数更多
System.out.println("b= "+b); //6.400000095367432
}