【问题标题】:Why this narrowing conversion (Maximum long value to byte) has the value of -1? [duplicate]为什么这种缩小转换(最大长值到字节)的值为-1? [复制]
【发布时间】:2022-01-23 05:06:00
【问题描述】:

我使用此网站进行转换: https://www.binaryhexconverter.com/binary-to-decimal-converter

9223372036854775807 表示为 01111111111111111111111111111111111111111111111111111111111111

而一个字节占用1个字节,也就是8位,所以最后8位是:11111111 使用上面链接的网站将其转换回一个数字,我得到 255,而不是 -1。

请看我的代码。

非常感谢您帮助我。

   long l = 9223372036854775807L;
   System.out.println("Value of B: " + l);

   byte b = (byte) (l);
   System.out.println("Value of B: " + b);

这有以下结果:

Value of B: 9223372036854775807
Value of B: -1

【问题讨论】:

标签: java


【解决方案1】:

这是完全正常的,因为在 Java 中字节是从 -128 到 127,而不是从 0 到 255。Java 有符号字节中的 -1 对应于无符号字节中的 255。

【讨论】:

  • 最高位不是符号位吗?那么有符号字节中的 -1 将是 10000001 吗?还是我把它和 C++ 混在一起了...
  • @TylerV 你把它搞混了。在two's complement 中,-1 是二进制 11111111。
  • 谢谢,所以它基本上只取决于一个字节是有符号还是无符号(所以如果它也被解释为负/正范围或者整个范围都在非负区域上)所以网站我后一种情况使用计算的字节,而java的字节属于第一种情况。这就是为什么需要使用链接源中的表格进行小的重新计算。
【解决方案2】:
byte byteVal = (byte)238; // -18
int intVal = byteVal; // sign extended to maintain 2's complement value
System.out.println(byteVal); 
System.out.println(intVal);

打印

-18
-18
  • byte 打印为无符号值,并与0xFF (255) 一起打印。
  • 字节转换为int,如上。
  • 值的ANDing 保留较低的8 bits
System.out.println(byteVal&0xFF);

打印

238

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2011-04-19
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多