当前位置: 首页 > 知识库问答 >
问题:

Java中字节移位的怪异行为

漆雕成弘
2023-03-14
    int min1 = Integer.MIN_VALUE>>31; //min1 = -1
    int min2 = Integer.MIN_VALUE>>>31; //min2 = 1
    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!

为什么在Java中字节的位移位行为是这样的?

共有1个答案

太叔弘壮
2023-03-14

发生这种情况正是因为byte在执行按位运算之前被提升为intint-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
 类似资料:
  • 问题内容: 在使用on进行位移时,我注意到使用无符号右移()时会得到奇怪的结果。使用,右移(有符号:和无符号:)的行为均符合预期: 但是当我对进行相同操作时,无符号右移会发生奇怪的事情: 我认为可能是编译器正在内部将转换为,但似乎不足以解释这种行为。 为什么在Java中以字节的方式进行位移位? 问题答案: 这种情况正是因为被晋升到前执行按位运算。表示为: 因此,向右移至7或8位仍保留第7位1,因此

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

  • 问题内容: 为什么这样做有效: 但这不是: 如果我有一个数组实例变量,并且想在我的构造函数中对其进行初始化,那么我不必走 我觉得我在这里想念什么吗? 问题答案: 这里的构造在Java中称为数组初始化器。这是一个特殊的速记,仅在某些语法构造中可用: [JLS 10.6数组初始化器](http://java.sun.com/docs/books/jls/third_edition/html/array

  • 问题内容: 令人难以置信。为什么输出-124? 问题答案: 在Java中,an 是32位。A 是8 。 最原始的类型Java中的签名,,,,和long被编码在二进制补码。(类型为unsigned,并且sign的概念不适用于。) 在此数字方案中,最高有效位指定数字的符号。如果需要更多位,则将最高有效位(“ MSB”)简单复制到新的MSB中。 因此,如果你具有 并将其表示为 32位,则只需将1复制到左

  • 我正在设计一个网站,有一些h3标题和段落,包装在一个名为“featured-info”的div类中。此外,我还有一个footer元素,它位于主体中的主包装器中。各段用斜体字写成: 并且页脚有边框: 页脚文本也是一个h4向上感知: 主要的问题是我有一个设置:@media screen和(最小宽度:750px),它使一些导航按钮内联,并调整一些文本的大小,但是...当页面大小小于750px时,页脚样式