Java无符号移位运算符以及数据类型转换的问题
不懂就问,我是熟悉C语言,最近接触Java,关于无符号移位运算符>>>,如下图所示,不明白在移位和强制数据类型转换的时候出了什么问题?什么原理?应该如何修改、避免这种问题呢?请各位大神指教。百思不得其解,所以最后不得不补充处理:short iii = (short) ((crc >>> 8)&0xFF);这样才得到了理想结果
原理和c是一样的
只是byte和short类型做移位运算是会自动转成int类型来操作 无符号右移运算符,在进行运算的时候,会把左边的数据转换成 int 类型(或者 long 类型),然后在进行移动。
转换过程中, short --> int ,负数时,会补二进制1 的,所以,无符号右移之后,仍然是负数。
所以,使用无符号右移时,最好是先将 左边的操作数,转换成 int 或者 long 类型。
比如:
public static void main(String[] args) {
short crc = -6650;
int i_crc = crc & 0xFFFF;
short kkk = (short) (crc >>> 8);
short iii = (short) ((crc>>>8) & 0xFF);
short jjj = (short) (i_crc >>> 8);
System.out.println(kkk);
System.out.println(iii);
System.out.println(jjj);
}
执行结果:
-26
230
230 哦哦。我在编程的时候,使用的是 楼主的那种方式。反正,这两种方式,都能够理解。
除了 无符号右移,按位与运算,按位或运算 等,也会遇到相同的问题。
不足 32 位的操作数,都会自动转换成为32位的整数,然后,在进行运算。 我的理解是:
-6650的二进制如下:
原码: 1000 0000 0000 0000 0001 1001 1111 1010
反码: 1111 1111 1111 1111 1110 0110 0000 0101
补码: 1111 1111 1111 1111 1110 0110 0000 0110
>>>8:0000 0000 1111 1111 1111 1111 1110 0110
&0xFF0000 0000 0000 0000 0000 0000 1110 0110
所以:
kkk =0000 0000 1111 1111 1111 1111 1110 0110 转 short,即保留后16位:1111 1111 1110 0110 ,负数转成十进制(符号位不变,减1,然后按位取反):-26
iii =0000 0000 0000 0000 0000 0000 1110 0110 转short,即保留后16位:0000 0000 1110 0110,转成十进制:230
由于kkk和iii是不同的值,mmm和nnn理应不同。
short mmm = (short)(crc^kkk);
short nnn = (short)(crc^iii);
页:
[1]