【LeetCode7】【Reverse Integer】java中整形正負表示的一些思考

做LeetCode遇到了這樣一道題:
Reverse Integer

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

需要考慮整數溢出問題,在大一第一學期就學了計算機組成原理,那時候對編程一無所知,所以對溢出概念的理解很淺,這次做題正好遇到了這類問題,所以重新查資料溫習下相關的知識。

1.原碼:將一個整數,轉換成二進制,就是其原碼。如單字節的4的原碼爲:0000 0100;-4的原碼爲1000 0100。
2.反碼:正數的反碼就是其原碼;負數的反碼是將原碼中,除符號位以外,每一位取反。如單字節的4的反碼爲:0000 0100;-4的反碼爲11111011。
3.補碼:正數的補碼就是其原碼;負數的反碼+1就是補碼。如單字節的4的補碼爲:0000 0100;-4的補碼爲11111100。

ps:
1 字節(Byte) = 8 位(bit),在java中基本變量int爲32位,第一位爲符號位,1爲負,0爲正數。

在java中int正數、負數是如何表示的呢?
1.對於正數,三碼合一的性質,就不做進一步的思考。
Integer.MAX_VALUE = 2147483647 = 2^31-1,二進制表示爲:
01111111 11111111 11111111 11111111
2.但是對於負數,通過查找資料得知java是通過存儲負數的二進制補碼來進行運算。Integer.MIN_VALUE = -2147483648 = -2^31,java二進制補碼錶示爲10000000 00000000 00000000 00000000。
最小值補碼爲什麼是0的補碼錶示形式之一?主要有兩個疑問?1)直接計算-2^31的二進制補碼是會溢出的啊;2)10000000 00000000 00000000 00000000是“-0”的補碼形式啊。於是我試了一下java輸出“0”的二進制形式,發現是“0”,百思不得其解。之後查資料得到另外的方法。

總結如下:
(1)先求-2147483648+1 = -2147483647的三碼:
-2147483647
原碼:11111111 11111111 11111111 11111111
反碼:10000000 00000000 00000000 00000000
補碼:10000000 00000000 00000000 00000001
(2)-2147483648 = -2147483647-1,所以-2147483648
補碼爲 -2147483647的補碼-1,即:10000000 00000000 00000000 00000000,與上述java輸出的二進制補碼相同且符合計算規範。
ps:
網上有說int最小值表示爲10000000 00000000 00000000 00000000,這是java的規範,是爲了讓0的補碼形式起到一定的意義,當然也不排除這樣的可能。總之,在不溢出的情況下,計算的結果還是準確的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章