2个字节转成short

lwx_work 2009-07-28 11:41:37
2个字节转short,我是这样处理的
1、int a = (byte[0]<<8) | byte[1],结果有问题 当收到的byte[1]是负数,比如-128,a的结果就成了负数,请问为什么?符号位应该是不是1啊。

2、为什么-128&oxff 就会等于+128,与得结果符号位是1啊,为什么是整数。



...全文
729 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
0xff相当于0x000000ff,高位的0省略了,没有写出来.就像日常中,00012写为12一样.
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
最高的一位是符号位,正数为0,负数为1.
所以
-128
-->原码:10000000 00000000 00000000 10000000

原码转为反码就是除了符号位(最高位),其它余各位按位取反.

->反码:11111111 11111111 11111111 01111111

反码转为补码,就是反码加1.

-->补码:11111111 11111111 11111111 10000000
lwx_work 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bigbug9002 的回复:]
是的我弄错了.
对不起,搞错了一位.
-128
-->原码:10000000 00000000 00000000 10000000
-->反码:11111111 11111111 11111111 01111111
-->补码:11111111 11111111 11111111 10000000
-128&0xf
Java code11111111111111111111111110000000&00000000000000000000000011111111-------------------------------------00000000000000000000000010000000

结果是128
一个byte数只有8位,这个数参与运算(+,-,*,/,位运算等)时,要转为int来参与运算。增加的高位字节全要用byte的符号位填冲,这个就叫符号位扩展。
[/Quote]


受益匪浅,还有一问题,0xff为什么不会被符号位拓展,而byte型变量就会?
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
是的我弄错了.
对不起,搞错了一位.
-128
-->原码:10000000 00000000 00000000 10000000
-->反码:11111111 11111111 11111111 01111111
-->补码:11111111 11111111 11111111 10000000
-128&0xf
 11111111 11111111 11111111 10000000
&00000000 00000000 00000000 11111111
-------------------------------------
00000000 00000000 00000000 10000000


结果是128
一个byte数只有8位,这个数参与运算(+,-,*,/,位运算等)时,要转为int来参与运算。增加的高位字节全要用byte的符号位填冲,这个就叫符号位扩展。
lwx_work 2009-07-28
  • 打赏
  • 举报
回复
-128的原码应该是10000000吧,那么他在进行位运算时,会转成int是多少啊?
是00000000 00000000 00000000 10000000 啊 我觉得
为什么你说是 10000000 00000000 00000001 00000000 请解释一下好吗
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
一个byte数只有8位,这个数参与运算(+,-,*,/,位运算等)时,要转这int来参与运算。增加的高位字节全要用byte的符号位填冲,这个就符号位扩展。
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
数在计算机内都是以补码的形式存贮的。
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
-128
-->原码:10000000 00000000 00000001 00000000
-->反码:11111111 11111111 11111110 11111111
-->补码:11111111 11111111 11111111 00000000
-128&0xf
 11111111 11111111 11111111 00000000
&00000000 00000000 00000000 11111111
-------------------------------------
00000000 00000000 00000000 00000000

结果是0吧
lwx_work 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bigbug9002 的回复:]
1.int a=(byte[0] < <8)|(byte[1]&0xff)
[/Quote]

那请回答我的第二个问题,我想知道原理
bigbug9002 2009-07-28
  • 打赏
  • 举报
回复
1.int a=(byte[0]<<8)|(byte[1]&0xff)
breezes2008 2009-07-28
  • 打赏
  • 举报
回复
学点原码、反码、补码的知识就懂了,也就是负数在计算机的是怎样存储的。

62,628

社区成员

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

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