小白教程

 找回密码
 立即注册
查看: 7055|回复: 4

[已解决]Java无符号移位运算符以及数据类型转换的问题

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-5-17 10:28:21 | 显示全部楼层 |阅读模式
不懂就问,我是熟悉C语言,最近接触Java,关于无符号移位运算符>>>,如下图所示,不明白在移位和强制数据类型转换的时候出了什么问题?什么原理?应该如何修改、避免这种问题呢?请各位大神指教。

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


最佳答案
2021-5-21 12:21:44
无符号右移运算符,在进行运算的时候,会把左边的数据转换成 int 类型(或者 long 类型),然后在进行移动。
转换过程中, short --> int ,负数时,会补二进制1 的,所以,无符号右移之后,仍然是负数。
所以,使用无符号右移时,最好是先将 左边的操作数,转换成 int 或者 long 类型。
比如:
  1.   public static void main(String[] args) {
  2.         short crc = -6650;
  3.         int i_crc = crc & 0xFFFF;
  4.         short kkk = (short) (crc >>> 8);
  5.         short iii = (short) ((crc>>>8) & 0xFF);
  6.         short jjj = (short) (i_crc >>> 8);
  7.         System.out.println(kkk);
  8.         System.out.println(iii);
  9.         System.out.println(jjj);
  10.     }
复制代码

执行结果:
  1. -26
  2. 230
  3. 230
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-18 09:03:18 | 显示全部楼层
原理和c是一样的
只是byte和short类型做移位运算是会自动转成int类型来操作
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-21 12:21:44 | 显示全部楼层 &
无符号右移运算符,在进行运算的时候,会把左边的数据转换成 int 类型(或者 long 类型),然后在进行移动。
转换过程中, short --> int ,负数时,会补二进制1 的,所以,无符号右移之后,仍然是负数。
所以,使用无符号右移时,最好是先将 左边的操作数,转换成 int 或者 long 类型。
比如:
  1.   public static void main(String[] args) {
  2.         short crc = -6650;
  3.         int i_crc = crc & 0xFFFF;
  4.         short kkk = (short) (crc >>> 8);
  5.         short iii = (short) ((crc>>>8) & 0xFF);
  6.         short jjj = (short) (i_crc >>> 8);
  7.         System.out.println(kkk);
  8.         System.out.println(iii);
  9.         System.out.println(jjj);
  10.     }
复制代码

执行结果:
  1. -26
  2. 230
  3. 230
复制代码
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-28 01:22:01 | 显示全部楼层
哦哦。我在编程的时候,使用的是 楼主的那种方式。反正,这两种方式,都能够理解。
除了 无符号右移,按位与运算,按位或运算 等,也会遇到相同的问题。
不足 32 位的操作数,都会自动转换成为32位的整数,然后,在进行运算。
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-31 09:35:22 | 显示全部楼层
我的理解是:
-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);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 12:35 , Processed in 0.027473 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表