2012-11-13 162 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; 

甚至沒有編譯,所以很難看出你的問題是真的。