【问题标题】:Understanding Hex number to Decimal in two compliment - Java了解二进制补码中的十六进制数 - Java
【发布时间】:2012-11-02 08:57:19
【问题描述】:

我想了解this 在这里的回答。

这两个0xf20xfffffff2 值如何代表-14?能否详细说明一下转换过程?

不过,我知道什么是二进制补码。

【问题讨论】:

  • 两个的补码,不是 Tow 的补码...
  • 请注意,0xf2 == -14如果您的字长为 8 位,类似地,0xfffffff2 == -14适用于 32 位字长;除了使用二进制补码表示的要求。
  • 在 Java 中,0xf2 not 代表 -14。 0xf2 不是byte 常量;一个int 常量,其值为242。尝试编译byte b = 0xf2;,你会得到一个错误。
  • 这里完美解释Two's complement,我记得是这样的:像普通二进制数一样读取二进制补码,而不是加减最高位的值。

标签: java hex type-conversion byte twos-complement


【解决方案1】:
0xf2 = 11110010

第一位是符号位。所以符号是负号。要获得实际价值,请接受 2 的恭维。

11110010 -> 1's complement -> 00001101 -> Add 1 -> 00001110 = -14

同样,请使用0xfffff...f2符号位在开头。取2的补码。

1111-1111-1111.....0010 -> 1's complement -> 00000000000...1101 -> Add 1 -> 0000...1110 -> -14

前面的任何数量的1111... 不会对负符号数的值产生影响,就像0000.. 不会对正值产生影响一样。


上面的计算是针对8-bit signed 0xf232-bit signed 0xfffffff2,两者数学上相等

【讨论】:

  • 在 Java 中,0xf2 是(32 位)int 值,而不是 8 位字节。如果你尝试byte b = 0xf2;,你会得到一个编译错误。
  • @TedHopp 这不是从 Java 角度来看的,而是在一般情况下。我知道,大多数编程语言都有 32 位粒度,所以它根本不是 -ve 数字。
  • 具有 32 位粒度,0xf2 === 0x000000f2.(32 位)。但是,当您将 8 位 0xf2 与 32 位 0xfffffff2 进行比较时,它们完全相等。
  • @KevinRave - 根据Java Language Specification: "整数文字如果后缀为 ASCII 字母 L 或 l (ell),则为 long 类型;否则为 int 类型(§4.2.1)。" 当您使用 int 文字初始化 byte 变量时,编译器将尝试自动向下转换该值。但是,如果值不合适,它会抱怨。由于 0xf2(int 值 242 base 10)不适合 byte,因此您会收到错误消息。你需要明确地转换它:byte b = (byte) 0xf2;.
【解决方案2】:

在二进制数中,当使用二进制补码时,负值将最高有效位设置为 1。它是哪个位,这取决于它是多少位。

0xf2 解释为 8 位有符号值是 -14,而0xfffffff2 解释为 32 位有符号值是相同的 -14。

32 位 0x000000f2 将是 242,与 无符号 8 位 0xf2 相同(注意:Java 没有任何无符号整数类型)。

【讨论】:

  • @KevinRave - 好吧,“粒度”不是我的术语。在我之前对@Cthulhu 答案的评论中,我链接到Java 语言规范部分,该部分指定在Java 中,末尾没有“L”(大写或小写)的整数文字是int 值。然后该部分链接到第 4.2.1 部分,该部分将 int 描述为从 -2147483648 到 2147483647(含)。那是 32 位表示的范围。 Java 虚拟机规范还规定int 值是 32 位有符号二进制补码值。
  • @KevinRave - 在您在问题中引用的帖子中,它描述了“字节 0xf2”。这表示byte(8 位)原语恰好具有十六进制值 0xf2。我唯一的观点是 0xf2 作为 Java 文字 不是 byte 值,而是 int 值。这基本上是一个警示性警告,您不能使用 0xf2(或高于 0x7f 的任何值)来初始化 byte 变量,而无需将其显式转换为 byte
  • @KevinRave 这是补码...0xF2 = 11110010 bin。否定这一点,即。取其补码为00001101 bin + 1 = 00001110 bin = 14。
  • @KevinRave - 作为int 文字,0xf2 是 0x000000f2(32 位值)的缩写。未设置符号位。作为一个 8 位值,hyde 在他最后的评论中提到了这一点。
  • @KevinRave 这里有两个不同的东西。一个是字段的宽度(8 v/s 32 位),另一个是它是有符号的还是无符号的。 8 位字段中的 0xF2 有符号时为 -14,无符号时为 242。 32 位 0xF2(相当于 0x000000F2)总是 242(有符号/无符号)。 32 位字段中的 0xFFFFFFF2 有符号时为 -14,无符号时为 +4294967282。
【解决方案3】:

0xf2 和 0xfffffff2 这两个值如何表示 -14?

他们没有。

int a = 0xf2;
int b = 0xfffffff2;

是不同的值。它们代表相同数字的唯一情况是:

byte a = (byte)0xf2;
byte b = 0xfffffff2;

这是因为在整数上下文中使用字节时的符号扩展。请注意

byte a = 0xf2;

甚至不编译,所以很难看出你的问题到底是关于什么的。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多