jclj.net
当前位置:首页 >> jAvA负数位移问题。 10000000 00000000 00000000 0... >>

jAvA负数位移问题。 10000000 00000000 00000000 0...

有符号右移:>>无符号右移:>>>你问题里面的两个数分别是有符号和无符号的两种情况System.out.println(0x80000003 >> 1);System.out.println(0x80000003 >>> 1);

有符号右移:>> 无符号右移:>>> 你问题里面的两个数分别是有符号和无符号的两种情况

第二个正确,在计算机中以补码的形式存放.

>>(带符号右移)>>>(无符号右移) System.out.println(Integer.toBinaryString(-4));//11111111111111111111111111111100 System.out.println(Integer.toBinaryString(-4>>3));//11111111111111111111111111111111 System.out.println(Integer.toBinaryString(-4>>5));//11111111111111111111111111111111

有符号右移会保留最高位的符号位,从次高位开始逐位右移填0;而无符号右移会将符号位一起右移,并将高位全部填0.例:对于一个byte类型的数10010100来说,有符号右移2位变为10000101,而无符号右移2位变为00100101.前者仍然是一个负数,而后者变成了正数.左移只有有符号的,没有无符号左移.

Integer.max_value = 01111111 111111111111111111111111+1 = 10000000 00000000 00000000 00000000最高位是符号位为1,这个数是负数,负数的源码是补码取反+1,刚好等于Integer.min_value结果当然是负数了,Integer的最小值

11010011 << 1 表示所有位居向前移一位,原有的符号保留,如果是正数还是正数,负数还是复数.位移以后的数为:10100110,由于在向前移的过程中,原来的第一位超出了范围,所以将被舍弃,原来的最后一位向前移以后,不足的位数用0

int占4个字节 所以有32位 8的二进制为 0000000000001000 补码为 -8绝对值的二进制反码加1 所以是1111 1111 1111 1000

一个btye类型占8个位,按照2的八次方来乘积实际等于256,但因为第一位表示的正数还是负数,所以实际是2的7次方来算,所以是127到-128

如果本身是二进制数,因为是正数,按8位计算,原码、反码和补码都是00010110

相关文档
网站首页 | 网站地图
All rights reserved Powered by www.jclj.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com