2012-11-13 112 views
1

我想了解this这里的答案。了解在十个十进制中的十六进制数字 - Java

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

虽然我知道什么是二补。

+0

*两*的补码,而不是Tow的补码... – hyde

+0

谢谢。更正 –

+0

请注意,只有* 0xf2 == -14 * * *如果您的字大小是8位,并且类似地,0xfffffff2 == -14 *仅*对于32位字大小;除了要求使用二进制补码表示法。 – twalberg

回答

2
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这两者都是数学上等于

+0

完美。非常感谢! –

+0

在Java中,0xf2是一个(32位)“int”值,而不是一个8位字节。如果你尝试'byte b = 0xf2;',你会得到一个编译错误。 –

+0

@TedHopp这不是Java视角,而是一般。据我所知,大多数编程语言都有32位的粒度,所以它根本不是-ve数。 –

2

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

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

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

+0

实际上,在Java中0xf2是32位的242. –

+0

@TedHopp是的,AFAIK Java根本没有字节文字,我会编辑答案更加清晰。 – hyde

+0

@TedHopp请问您可以给我一篇文章阅读关于此“粒度”的更多信息吗? –

0

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

他们没有。

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

是不同的值。在那里它们代表相同的数目的唯一情况是:

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

那是因为符号扩展的,当一个字节是在的整数上下文中使用。请注意,

byte a = 0xf2; 

甚至没有编译,所以很难看出你的问题是真的。