对于位运算符的问题

来源:5-1 UDP搜索IP与端口-1

weixin_慕莱坞8108303

2023-02-03

老师,对于代码:short cmd = (short)((clientData[index++] << 8) | (clientData[index++] & 0xff));,其中的clientData[index++] << 8内部具体是怎么完成的,因为java中左移操作不是高位会被移除吗,那这样的话,对于一个8位的字节来说,左移8位不就都是0了,怎么会使一个字节在左移8位之后扩展到两个字节,最后再强转到short类型

写回答

1回答

Qiujuer

2023-02-04

java的位操作会自动转型为int来进行;也就是说如果我们没加(short)强转,那么最终的值是一个int值。

clientData[index++] 会先转化为 int,高位补0,然后再左移8,此时也是一个Int,所以左移的数据并不会被丢掉。

最后是将int转位short,此时会丢掉左边的16位;但我们有效的其实是尾部的16位,所以就没啥问题。

0
2
Qiujuer
回复
weixin_慕莱坞8108303
是的哈,这是java默认隐式转换了
2023-02-09
共2条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2316 学习 · 476 问题

查看课程