開篇
本文主要介紹在Java
中,為什么int
類型的最大值為2147483647
。
理論值
我們都知道在Java
中,int
的長度為32位。
理論上,用二進制表示,32位每一位都是1的話,那么這個數(shù)是多少呢?
我們來計算一下,第0位可以用20^00表示,第1位可以用21^11表示,第31位可以用231表示,那么32位二進制能夠表示的最大值為232 - 1,所以理論上32位數(shù)值的取值范圍為0 ~ 232 - 1。
那么,Java的int最大值真的為232 - 1嗎?
我們知道,232 - 1這個值為42億多。而在Java
中,int
的最大值為2147483647
也就是21億多,為什么有這個差距呢?
分析
我們來看下,Java
中int
的最大值以及這個最大值的二進制數(shù)據(jù)。
可以看到,int
的最大值的最高位為0
,而不是1
,也就是用31
位來表示能夠取到的最大值,而不是32
位。 因為在Java
中,整型是有符號整型,最高位是有特殊含義,代表符號,真正表示數(shù)據(jù)值的范圍為0 ~ 30
位。
所以,按照31位來表示的話,其最大值為231 - 1,而這個值就是2147483647
即21億多。
int
數(shù)據(jù)有正負之分,所以最高位用來表示符號,0
代表正數(shù),1
代表負數(shù)。因此Java
中,int
的數(shù)據(jù)范圍為 -231 ~ 231 - 1。
為啥減1
那為什么都是231, 正數(shù)的時候需要減1呢?
我們先來看一下,int的最大值和最小值:
不看符號位的話,最大值比最小值少了1個,這是因為0
歸到正數(shù)里面,所以占用了正數(shù)的一個位置。
拓展
負數(shù)表示
負數(shù)的二進制形式如何表示呢?
先看-100這個數(shù)的二進制形式:
最高位為1,就代表負數(shù)。值就為符號位后面的值取反再加上1。
二進制1100100
對應(yīng)的10進制
就是100
.
反碼
反碼就是,對一個數(shù)的二進制除符號位外,按位取反。取反就是二進制數(shù),1變成0,0變成1,這個過程就是取反。
來看一個例子:
可以看到,a
、b
兩個數(shù)的二進制是完全相反的。
為什么要取反加1呢?為什么要設(shè)計的這么扭曲?到底是人性的扭曲還是道德的淪喪? 這樣設(shè)計有什么好處?
在計算機系統(tǒng)里,加減乘除的運算,并不是我們想象中10進制的加減乘除,他最后都會被翻譯成2進制的位運算來計算。
假如有2個數(shù),a
、b
都是整數(shù),那么a + b
對應(yīng)的二進制就是簡單的相加。那么如果a
為負數(shù),b
為正數(shù)呢?在執(zhí)行a + b
的時候,難道還需要特殊處理一下嗎?顯然是不可能的,在二進制運算中,加減乘除運算只有各自的一套邏輯,無論符號兩邊的數(shù)是什么樣子的。
a
為負數(shù),那么對a
進行取反加1,再與b
進行相加,可以按正常的相加邏輯,這樣運算結(jié)果依然是正確的,而不是說,當a
為負數(shù)時,計算機去執(zhí)行另一套的相加邏輯。設(shè)計成取反加1,可以讓相加運算不去關(guān)注兩邊的數(shù)據(jù)是正是負,只執(zhí)行一套相加邏輯就可以了,這對計算機來說是一個性能的提升。
示例
從上面我們得知,負數(shù)的二進制表示為數(shù)值部分取反加1,以-100
為例,那么可以得出-100
等于 ~100 + 1
。
知道負數(shù)的二進制的樣子后,再看int
最小值和-1
的二進制數(shù)據(jù),就不會驚訝了。要不然,當看到int
的最小值的二進制居然是一堆0
組成,而-1
居然是一堆1
,看到這樣的數(shù)據(jù),心里豈不是冒出一堆問號或者一群小羊飄過。
取反加1還是自己的數(shù)
有沒有一個數(shù),取反加1還是自己?有,0
和int
的最小值,下面來看下:
先看下Integer.MIN_VALUE
的取反加1的過程,可以看到,Integer.MIN_VALUE
在取反后加上1,仍然還是他自己。
再看下0
的取反加1過程,可以看到0
再取反加1后,我嘞個去,居然溢出了!溢出怎么辦?溢出就扔了吧不要了,結(jié)果還是他自己。
文章來源:http://www.zghlxwxcb.cn/news/detail-444297.html
后記
本文主要介紹在Java
中,為什么int
類型的最大值為什么是21億多,以及涉及到的知識點的拓展,如有錯誤歡迎之處。文章來源地址http://www.zghlxwxcb.cn/news/detail-444297.html
到了這里,關(guān)于算法| Java的int類型最大值為什么是21億多?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!