回答
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
這兩者都是數學上等於。
完美。非常感謝! –
在Java中,0xf2是一個(32位)「int」值,而不是一個8位字節。如果你嘗試'byte b = 0xf2;',你會得到一個編譯錯誤。 –
@TedHopp這不是Java視角,而是一般。據我所知,大多數編程語言都有32位的粒度,所以它根本不是-ve數。 –
在二進制數中,當使用二進制補碼時,負值將最高有效位設置爲1.哪一位取決於它的位數。
0xf2
解釋爲8位有符號值是-14,而0xfffffff2
解釋爲32位有符號值是相同的-14。
32位0x000000f2
將是242,相同無符號 8位0xf2
(注:Java沒有任何無符號整數類型)。
實際上,在Java中0xf2是32位的242. –
@TedHopp是的,AFAIK Java根本沒有字節文字,我會編輯答案更加清晰。 – hyde
@TedHopp請問您可以給我一篇文章閱讀關於此「粒度」的更多信息嗎? –
這兩個0xf2和0xfffffff2值如何代表-14?
他們沒有。
int a = 0xf2;
int b = 0xfffffff2;
是不同的值。在那裏它們代表相同的數目的唯一情況是:
byte a = (byte)0xf2;
byte b = 0xfffffff2;
那是因爲符號擴展的,當一個字節是在的整數上下文中使用。請注意,
byte a = 0xf2;
甚至沒有編譯,所以很難看出你的問題是真的。
- 1. 在C++中將十六進制十六進制字符標記爲十進制
- 2. 十六進制串&十六進制
- 3. 將十進制轉換爲十六進制和十六進制
- 4. 選擇一個十六進制附近的十六進制數
- 5. 十六進制字符串到十六進制整數
- 6. 十六進制爲十進制
- 7. 十六進制和十進制轉換
- 8. 使用十進制或十六進制
- 9. Javascript十進制到十六進制
- 10. 轉換十六進制到十進制
- 11. 十六進制
- 12. 十六進制
- 13. 十六進制
- 14. 十六進制到十進制轉換在java中
- 15. 十六進制和十六進制十進制之間的區別
- 16. 將十六進制轉換爲二進制到十六進制?
- 17. VBA隱藏十進制和十六進制的負數十進制數
- 18. 十六進制爲二進制和十進制在matlab中
- 19. 用於大數字的十進制到十六進制的Python
- 20. 如何比較十六進制數字與shell中的十六進制數字?
- 21. C++將十六進制字符串轉換爲十六進制char *十六進制數字
- 22. 解析Java中的十六進制
- 23. 轉換十六進制字符串十六進制值
- 24. 將字符串轉換爲十六進制到十六進制
- 25. python字符串與十六進制轉義十六進制值
- 26. 從十六進制到十進制,二進制到十進制和八進制到十進制程序C++
- 27. 將八進制數轉換爲十進制和十六進制
- 28. 十六進制,八進制,二進制到十進制(C++)
- 29. 二進制,八進制,十六進制到十進制程序
- 30. 解釋十六進制值?
*兩*的補碼,而不是Tow的補碼... – hyde
謝謝。更正 –
請注意,只有* 0xf2 == -14 * * *如果您的字大小是8位,並且類似地,0xfffffff2 == -14 *僅*對於32位字大小;除了要求使用二進制補碼錶示法。 – twalberg