Java无符号移位运算符以及数据类型转换的问题

luliily 2021-04-13 10:38:27
不懂就问,我是熟悉C语言,最近接触Java,关于无符号移位运算符>>>,如下图所示,不明白在移位和强制数据类型转换的时候出了什么问题?什么原理?应该如何修改、避免这种问题呢?请各位大神指教。

百思不得其解,所以最后不得不补充处理:short iii = (short) ((crc >>> 8)&0xFF); 这样才得到了理想结果。

...全文
258 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xharvard 2021-04-21
  • 打赏
  • 举报
回复
我的理解是: -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 &0xFF 0000 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);
冰思雨 2021-04-21
  • 打赏
  • 举报
回复
哦哦。我在编程的时候,使用的是 楼主的那种方式。反正,这两种方式,都能够理解。 除了 无符号右移,按位与运算,按位或运算 等,也会遇到相同的问题。 不足 32 位的操作数,都会自动转换成为32位的整数,然后,在进行运算。
冰思雨 2021-04-21
  • 打赏
  • 举报
回复
无符号右移运算符,在进行运算的时候,会把左边的数据转换成 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
qybao 2021-04-14
  • 打赏
  • 举报
回复
原理和c是一样的 只是byte和short类型做移位运算是会自动转成int类型来操作
luliily 2021-04-14
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
原理和c是一样的 只是byte和short类型做移位运算是会自动转成int类型来操作
我比较疑惑这两行代码为什么得出不一样的结果: short mmm = (short)(crc^kkk); short nnn = (short)(crc^iii);

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧