在Java中执行逐位OR和32位符号位扩展时出错

时间:2013-04-06 22:06:36

标签: java binary bitwise-operators

我无法理解java中的逐位OR。我正在阅读一本名为" Apress Beginning Java7"作者:Jeff Friesen。

在第31页的那本书中,作者提供了两个8位二进制数,并对这两个数字进行了逐位OR运算。他说:

  

0B0001 1010 | 0B1011 0111结果为0000 0000 0000 0000 0000 0000   1011 1111

然后他说,我引用了:

"&,^和|最后三行中的运算符首先将其字节整数操作数转换为32位 整数值(通过符号位扩展,将符号位的值复制到额外位)之前 执行他们的操作。"

现在,如果我理解正确,符号位扩展的前8位数(0B0001 1010)变为(32位数):

  

0B0000 0000 0000 0000 0000 0000 0001 1010

符号位扩展的第二个数字(0B1011 0111)变为:

  

0B1111 1111 1111 1111 1111 1111 1011 0111

如果我按位或者这两个扩展数字得到:

  

0B1111 1111 1111 1111 1111 1111 1011 1111

但作者得到了:

  

0B0000 0000 0000 0000 0000 0000 1011 1111

有谁可以告诉我错在哪里?我的意思是,任何人都可以告诉我为什么我的答案与作者和答案不同 我犯了哪个错误?

1 个答案:

答案 0 :(得分:1)

0B10110111二进制文字的值为int。它不会从byte隐式提升,因此没有符号扩展名。

如果是(byte)0B10110111那么你会得到你期望的结果。