public void putShort(short vol)
{
conData[inc++] = (byte)(vol);
conData[inc++] = (byte)(vol >>> 8 );
} public short getShort()
{
return (short)((conData[inc++] & 0xff)+((conData[inc++] & 0xff) << 8));
}上面的代码是别人的,大概意思是把16位的short 分两为放到8位的byte里吧。
低8位直接放入byte(这里是不是直接丢弃了高8位呢,他是默认直接取低8位放入byte 里吗)
高8位无符号向右移8位
getShort 的时候 用到了 <<8 这里好像是有符号 移位吧 那最高位岂不是成了符号位了吗? 那它的值是不是要改变了呢最后 & 0xff 这里 好像和没有用没什么差别吧
以上是小弟的理解。 望大虾们更正下 ,,,谢谢 !!
{
conData[inc++] = (byte)(vol);
conData[inc++] = (byte)(vol >>> 8 );
} public short getShort()
{
return (short)((conData[inc++] & 0xff)+((conData[inc++] & 0xff) << 8));
}上面的代码是别人的,大概意思是把16位的short 分两为放到8位的byte里吧。
低8位直接放入byte(这里是不是直接丢弃了高8位呢,他是默认直接取低8位放入byte 里吗)
高8位无符号向右移8位
getShort 的时候 用到了 <<8 这里好像是有符号 移位吧 那最高位岂不是成了符号位了吗? 那它的值是不是要改变了呢最后 & 0xff 这里 好像和没有用没什么差别吧
以上是小弟的理解。 望大虾们更正下 ,,,谢谢 !!
解决方案 »
- 如何将一个内存地址赋值给一个字节数组对象
- JAVA SE中图片切换的时候,也就是重画面板的时候能不能做出翻书的效果?
- 如何用facade模式数据库进行查询???
- 求扑克算法
- Java控制串口包Comm.jar使用的疑虑
- 现在有点迷茫,请各位指点
- java 代码中遇到,请问是什么意思?
- JavaFX 各种内建built-in布局管理器的使用
- JBuilder 编译时报错:"FunTableModel.java": Error #: 360 : unreported exception: java.sql.SQLException; must be caught or declare
- java如何读取mp3文件?
- 运动秒表,但有一个问题,高手帮忙看一下。。。
- 请问,怎么用DefaultCellEditor类来给JTABLE里面的单元格添加jcombobox
public class Test { static byte[] conData = new byte[2]; public static void main(String[] args) throws Exception {
putShort((short) 128);
System.out.println(getShort());
System.out.println(getShort2());
} public static void putShort(short vol) {
conData[0] = (byte) (vol);
conData[1] = (byte) (vol >>> 8);
} public static short getShort() {
return (short) ((conData[0] & 0xff) + ((conData[1] & 0xff) << 8));
} public static short getShort2() {
return (short) ((conData[0]) + ((conData[1]) << 8));
}
}
java没有unsigned,
128(10) = 0000 0000 1000 0000(2)
conData[0] = 0;
conData[1] = 1000 0000(2) = -128(10)
-128 << 8 = 1000 0000(2) = -128(10)(<<操作,符号位不变)
getShort2=0+(-128)=-128,
所以,需要&0xFF,保证取到的是无符号
笔误吧! conData[0]=-128【10】 = 10000000【2】
conData[1]=0【10】= 00000000【2】
说的很正确,这里补充一些:byte b=(byte)128; 结果大家都知道b=-128[10] 即10000000[2]。
这是因为128(int型)的高位24个零全部被抹去了,留下低位的8位二进制码:10000000。java都是有符号整数的。所以10000000被表示成为了负数(最高位为1),采用取反+1的原则表示成10进制结果为-128。int i=(int)b; 结果大伙也清楚:既然b=-128,你们此时i=-128。
没错,i会将b二进制码前面扩展出24个1(注意,不是扩展出0):11111111 11111111 11111111 10000000
然后这个32位二进制码也表示一个负数,结果也是-128。那么问题来了,怎么样才能让byte b扩充成int型屏蔽掉符号那?
答案只有一种,就是b & Oxff 注意Oxff也是int型的16为表示:00000000 00000000 00000000 11111111
这下清楚了,和Oxff &运算的结果就是 00000000 00000000 00000000 10000000 表示整数128