当前位置: 首页 > 面试题库 >

Java中带字节的位移位的怪异行为

通煜祺
2023-03-14
问题内容

在使用on进行位移时byte,我注意到使用无符号右移(>>>)时会得到奇怪的结果。使用int,右移(有符号:>>和无符号>>>:)的行为均符合预期:

    int min1 = Integer.MIN_VALUE>>31; //min1 = -1
    int min2 = Integer.MIN_VALUE>>>31; //min2 = 1

但是当我对进行相同操作时byte,无符号右移会发生奇怪的事情:

    byte b1 = Byte.MIN_VALUE; //b1 = -128
    b1 >>= 7; //b1 = -1

    byte b2 = Byte.MIN_VALUE; //b2 = -128
    b2 >>>= 7; //b2 = -1; NOT 1!
    b2 >>>= 8; //b2 = -1; NOT 0!

我认为可能是编译器正在内部将转换byteint,但似乎不足以解释这种行为。

为什么在Java中以字节的方式进行位移位?


问题答案:

这种情况正是因为byte被晋升到int前执行按位运算。int -128表示为:

11111111 11111111 11111111 10000000

因此,向右移至7或8位仍保留第7位1,因此结果缩小为负值byte

比较:

System.out.println((byte) (b >>> 7));           // -1
System.out.println((byte) ((b & 0xFF) >>> 7));  //  1

通过b & 0xFF,在移位之前清除所有最高位,因此按预期产生结果。



 类似资料:
  • 为什么在Java中字节的位移位行为是这样的?

  • 问题内容: 考虑以下代码(其中byteIndex是一个int): 这会产生错误 编译时(必需字节,位于int)。 代码 编译良好。 这是什么问题,我该如何解决第一个示例以允许将整数值按int值进行移位? 编辑:根据评论,这是一个更完整的示例: 和给出的错误是: 问题答案: 将您的行转换为此:- 您的RHS是一个整数,您需要将其转换为字节。 上面的代码将正常工作..不管有没有的到 因此,您也可以:-

  • 问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符

  • 问题内容: 我如何迭代字节数组中的位? 问题答案: 你必须写自己的实施历时字节数组,然后创造价值,其记忆中的当前索引的字节数组 和 当前字节中的当前索引。然后像这样的实用方法会派上用场: (范围为0到7)。每次调用时,您都必须在当前字节中增加位索引,并且在到达“第9位”时也必须增加字节数组中的字节索引。 这并不 难 -有点痛苦。让我知道您是否需要示例实现…

  • 5、带进位的循环移位指令 带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。 指令的格式:RCL/RCR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示

  • 问题内容: 我有一个这样的测试程序: 它产生以下输出: 我期望(1)和(3)相同,以及(2)和(4)相同。 使用gcc版本:gcc.real(Ubuntu 4.4.1-4ubuntu9)4.4.1 怎么了? 问题答案: 根据C标准 §6.5.7.3 ,按类型大小移动是未定义的行为: 6.5.7按位移位运算符 (…)如果右操作数的值为负或大于 或等于 提升后的左操作数的宽度,则行为未定义。 您的编译