首先我是因为这几个代码,产生结果引入的深思!
结果是:
问题就来了:
1、首先>>和<<操作很简单,逻辑<<低位补0就行,而>>补符号位
2、就是典型的(int) 转(byte)类型了,这里举上面图片代码的例子
System.out.println(0Xa2); //162
System.out.println((byte)0xa2); //-94
这是为什么呢?,答案是int是4个字节也就是32位,而byte是8位有符号,一般默认的int是32位带符号位的
所以 oxa2(int) : 0000,0000,0000,1010,0010
而转换位Byte后就是 1010,0010,但是因为Byte是带符号位的,所以就成为了负数,因为计算机求值都是通过补码来计算的,既然是负数,就要除符号位取反然后+1,来求得值,所以是-94
3、就是难一点的问题了>>>逻辑右移符号运算符
>>>是不论符号位是啥,前面都补0!
我们再来看看前面图片的代码:
System.out.println(0Xa2 >>> 2); //40
这个比较简单,用前面无符号定义就能解决
System.out.println((byte)0xa2 >>> 2); //1073741800
这个就麻烦很多了
前面以及提到int转byte的问题了,这里的转到byte就是1010,0010,然后逻辑右移两位,那就是简单补0,为什么成了这么大的数了呢?
这是因为,java的int是4个字节32位的,在控制台进行输出的时候,jvm把1010,0010之前进行了补全
补为补为11111111 11111111 11111111 1000 1000
java中,转换时int输出时 :
若byte符号位是0,如01001000,则进行int补0处理–>00000000 00000000 00000000 01001000;
若byte符号位是1,如11001000,则进行补1处理–>1111111 11111111 11111111 11001000
参考博客:
Java>>与>>>的区别:
https://blog.csdn.net/qq_35402412/article/details/81156020
(byte)0x80>>2为什么是-32 :
http://blog.sina.com.cn/s/blog_92f4203e0101a4rb.html
java中的二进制int与byte互转以及&0xff的作用:
https://blog.csdn.net/weixin_33547926/article/details/52385773