java byte强转short_补码——Java类型byte强转short发现的坑

背景

做音频开发的同学一般会和byte数组打交道比较多,因为PCM原始数据一般都是byte数组来表示,如果音频的位深是16bit,那就会是连续两个byte元素表示一个音频幅值。如果需要对幅值进行计算,那就要先将两个byte还原回short值(16位数)再进行计算。

我的byte数组是小端存储,于是我想当然的认为short值计算的Java代码应该是:

//2个byte转化为1个short

//将高字节填充到short的高8位,低字节填充到short的低8位

short data = bytes[0] + (bytes[1] << 8);

复制代码

运行结果发现,在两个byte都是正数的情况下无问题,任一个是负数或者两个负数的情况下,会出现高8位数据减去了1的情况。比如:

0xb1 + (0x04 << 8) 会得到值 0x03b1,而不是 0x04b1

复制代码

原因

补码

学计算机组成原理的时候,相信大家都对“补码”一词有概念。这个问题正是补码引起的。

CPU里只有加法器(ALU),没有减法器,因为可以用补码将减法变为加法。

原码和补码的关系:

正数: 补码和原码一致

负数: 原码的符号位不变,其他位取反加1就是补码

如:

-1的原码(8bit) : 1000 0001

-1的补码(8bit) : 1111 1111 (即0xff)

所以,做个最简答的减法 1 - 1

得:1 - 1 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值