关于java关于逻辑运算符和移位运算符的深入问题

首先我是因为这几个代码,产生结果引入的深思!
在这里插入图片描述
结果是:
在这里插入图片描述

问题就来了:

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

猜你喜欢

转载自blog.csdn.net/qq_40940540/article/details/85851933