關於java中基本取值范圍許多人都了解,可是都是如何計算出來的呢?
首先把查到的基本類型取值范圍展示一下:
那么問題來了:例如byte的取值范圍如何計算出來的呢?
按照我們初學者的理解1byte=8bit,也就是說1個字節可以用8位二進制數表示。那么取值范圍怎么表示呢?
對於人類來說,我覺得十進制才是我能理解的范疇,所以取值范圍我就轉化為十進制吧;注(因為第一位為
符號位 0正1負)所以取值范圍為:11111111~01111111即-127~127。
我擦說好的-128呢?
我查看網上的許多人的計算方法總結如下:
1、因為1byte表示256個數(用一個字節(8位)表示出來(2^8=256)),所以有人將其拆開正負各一半,即
-128~127(這個是127而不是128是因為0也是正數啊,所以划分后128變127了)。
2、這個就專業知識要一些了。其實,1111 1111表示的是-1,而不是-128;
首先,因為要表示出負數,所以它的最高位是符號位。0表示正數,1表示負數;如:
127是0111 1111這樣表示的。-128是1000 0000這樣表示的。127后面是-128,最
大的正數加下來是最小的負數。這就跟鍾表一樣,12點鍾后面是1點中鍾一樣。
因為它是用補碼的編碼方式。
(下面的看不懂可以直接跳過,或者百度了解之后再看)
正數的補碼就是它的原碼,也就是單純的二進制數。負數的話,看下面例子:
1111 1111這個二進制串,首先它最高位是1,明確他是個負數。
那么其余位是111 1111,按位取反得到:000 0000,再加1就是:000 0001
也就是1,再加上符號位。最終結果是-1。
3、這個是我比較理解的解釋。首先我們對計算機的二進制麻木不堪,還是十進制好一些。
你可以這樣想,第一位符號位我們暫時不去考慮,那么剩下的七位組成的最小值為多少?
就是000,0000,這時將符號位添加1000,0000不就是最小的數了(因為1是負號啊),
這時轉化為十進制得出-128。
歡迎各位大神能提出更好的理解方案