在二进制补码中理解十六进制数到十进制 - Java

时间:2012-11-13 21:25:02

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

我在这里试图理解this的答案。

这些0xf20xfffffff2值如何代表-14?你能详细说明转换过程吗?

我知道什么是Two的补充。

3 个答案:

答案 0 :(得分:3)

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 0xf2针对32-bit signed 0xfffffff2在数学上等于

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

  

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

他们没有。

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

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

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

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

byte a = 0xf2;

甚至没有编译,因此很难看出你的问题是什么。