Java中带字节的算术运算

时间:2018-08-15 11:47:23

标签: java binary

我知道byteshort数据类型在Java中没有得到2's complement处理。下面的示例演示了我的这一说法:

byte b1 = 0xFF;    //error, 255 is outside the range of byte
byte b2 = 0b1100;    //12 is stored, and not -4

现在,举一个例子:

byte b3 = 0;
b3 += 0xFF;
System.out.println(b3);    //prints -1 on the console

上例中的第二行是否应该抛出错误,单个0xFF255并且在byte范围之外?

还有,byteshort这个不公平的游戏是什么?我的意思是,为什么不像2's complement systemint一样使用long来解释它们?

3 个答案:

答案 0 :(得分:4)

它们是2的补码-不知道您从哪里得到的(但这是错误的)。这个:

byte b1 = 0xFF;

无效,因为它确实超出了byte的范围。但是,这是

byte b3 = 0;
b3 += 0xFF;

因为+=是在int的较大范围内完成的,所以您将其分配给byte,它占用最后8位,恰好是-1

答案 1 :(得分:2)

您应该阅读Java语言规范,而不是尝试通过绘制逻辑推断来解决此问题:

第1点。byteshort是带符号的类型。

  

“整数类型的值是以下范围内的整数:

     
      
  • 对于byte,从-128到127(包括首尾)
  •   
  • 对于short,从-32768到32767(含)“来源JLS 4.2.1
  •   

点2。带符号整数类型是2的补码。

  

“整数类型为byteshortintlong,其值分别为8位,16位,32位和64-位分别是带符号的二进制补码整数和char,其值是代表UTF-16代码单元(第3.1节)的16位无符号整数。”来源JLS 4.2

第3点。您无法将int变量分配给byte变量。

  

如果右侧操作数的类型与变量(§5.2)的类型分配不兼容,则发生编译时错误。来源JLS 15.26.1

第4点。您可以为int变量提供分配一个byte编译时常量表达式,该表达式的值在{{1 }}。

  

“此外,如果该表达式是类型为bytebyteshortchar的常量表达式(§15.28):

     
      
  • 如果变量的类型为intbyteshort,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄基元转换。”来源JLS 5.2
  •   

第5点。char等同于b3 += 0xFF

来源JLS 15.26.2

第6点。没有b3 = (byte)(b3 + 0xFF)byte文字。

来源JLS 3.10.1

答案 2 :(得分:1)

如果要转换-minus值,Java 8附带了实用程序方法来支持无符号操作

byte b1 = (byte) 0xFF;
Byte.toUnsignedInt(b1); // this method will return 255