1. 程式人生 > >java中的基本資料型別儲存的範圍原理解釋總結

java中的基本資料型別儲存的範圍原理解釋總結

首先呢,我先將結果給大家以表格的形式表現出來,原因呢我下面會解釋。

資料型別 位元組長度 表示範圍(二進位制形式) 表示範圍(數值)
 byte(位元組型) 1 10000000~01111111 -128(-2^7)~127(2^7-1)
short(短整型) 2 10000...0000(後面15個0)~0111111111....111111(後面15個1) -32768(-2^15)~23767(2^15-1)
int(整型) 4 10000...0000(後面31個0)~0111111111....111111(後面31個1) -2147483648(-2^31)~2147483647(2^31-1)
long(長整形) 8 10000...0000(後面63個0)~0111111111....111111(後面63個1)
-9223372036854775808(-2^63)~9223372036854775807(2^63-1)
float(單精度) 4 1 01111111 1111...11111 (後面23個1)~001111111 1111...11111 (後面23個1) -3.4028235E38(-2*2^127)~3.4028235E38(2*2^127)
double(雙精度) 8 1 01111111111  11111...1111(後面共52個1)~0 01111111111  11111...1111(後面共52個1) -1.7976931348623157E308(-2*2^1023)   ~1.7976931348623157E308(2*2^1023
)
char(字元型) 2 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111           0    -   65535(2^16-1)

(無窮沒有表示)

(無窮沒有表示)

 (無符號i)

壹:

就以byte為例介紹:(整數方面事符號位:    0正1負)

<1>byte   1個位元組 ,所以說就有8位二進位制程式碼  

<2>_ _ __ ____ 橫線代表一個位,因為規定最高位是符號位,所以說最大的數用二進位制表示就為 0111 1111

   ( 2^0+2^1+2^2+2^3+2^4+2^5+2^6 = 2^7-1)

<3>同樣不難理解,byte型別最小的數自然就是1 0 0 0   0 0 0 0       (也是一種規定,關於補碼溢位的)               

 ( -2^7)

“這裡需要知道,對於二進位制的負數在計算機中的儲存是以補碼的形式存在的,也就是說,在計算機中看到的負數的二進位制不是其真正的二進位制是其補碼的二進位制表示”

<4>總體而言,byte的範圍是有 256(2^8)個數,因為是有8位所以就是2的8次,java分為正負的兩部分所以上面的就是2 的7次,有0的話所以正數的絕對值比負數的絕對值少1

<5>其他的型別與byte相同,原理一樣,其他語言的原理也一樣

貳:

以float為例講一下,關於float的儲存範圍的問題,java中對於實數(浮點數)的儲存是在二進位制的位數上儲存了指數部分

<1>  flaot的儲存示意圖


(圖片來自於Quora)

sign 代表符號位 1 代表負數 0代表正數;    exponent  代表指數位  最大為127 ,和byte有一點點聯絡   其中第30位(0代表指數為 1 為正);

fraction 代表小數位,共有23位實際上表示24位,第24位唯一 是1  ,所以表示的小數就是  1.   ..........

                                       31                       30                  29----23               22----0         

表示實數符號位        指數符號位           指數位             有效數位(就是科學記數法的前面的那個有小數點的數)

<2> 將一個float型轉化為記憶體儲存格式的步驟為:

(1)先將這個實數的絕對值化為二進位制格式,注意實數的整數部分和小數部分的二進位制方法在上面已經探討過了。 
     (2)將這個二進位制格式實數的小數點左移或右移n位,直到小數點移動到第一個有效數字的右邊。 
     (3)從小數點右邊第一位開始數出二十三位數字放入第22到第0位。 
     (4)如果實數是正的,則在第31位放入“0”,否則放入“1”。 
     (5)如果n 是左移得到的,說明指數是正的,第30位放入“1”。如果n是右移得到的或n=0,則第30位放入“0”。 
     (6)如果n是左移得到的,則將n減去1後化為二進位制,並在左邊加“0”補足七位,放入第29到第23位。如果n是右移得到的或n=0,則將n化為二進位制後在左邊加“0”補足七位,再各位求反,再放入第29到第23位。

          舉例說明: 11.9的記憶體儲存格式

       (1) 將11.9化為二進位制後大約是" 1011. 1110011001100110011001100..."。

       (2) 將小數點左移三位到第一個有效位右側: "1. 011 11100110011001100110 "。 保證有效位數24位,右側多餘的擷取(誤差在這裡產生了 )。

       (3) 這已經有了二十四位有效數字,將最左邊一位“1”去掉,得到“ 011 11100110011001100110 ”共23bit。將它放入float儲存結構的第22到第0位。

       (4) 因為11.9是正數,因此在第31位實數符號位放入“0”。

       (5) 由於我們把小數點左移,因此在第30位指數符號位放入“1”。

       (6) 因為我們是把小數點左移3位,因此將3減去1得2,化為二進位制,並補足7位得到0000010,放入第29到第23位。

   最後表示11.9為:01000001001111100110011001100110

           再舉一個例子:0.2356的記憶體儲存格式
      (1)將0.2356化為二進位制後大約是0.00111100010100000100100000。 
      (2)將小數點右移三位得到1.11100010100000100100000。 
      (3)從小數點右邊數出二十三位有效數字,即11100010100000100100000放
入第22到第0位。 
      (4)由於0.2356是正的,所以在第31位放入“0”。 
      (5)由於我們把小數點右移了,所以在第30位放入“0”。 
      (6)因為小數點被右移了3位,所以將3化為二進位制,在左邊補“0”補足七
位,得到0000011,各位取反,得到1111100,放入第29到第23位。

 最後表示0.2356為:   001111100 11100010100000100100000



<3>對於最後的值有一個計算的公式:

float的值 = (1)S(2E127)(1.M)

S代表符號

E代表指數

M代表有效小數部分

float類的指數是8位移碼,最大為127最小為-126,

(23-30位共8位為指數位,這裡指數的底數規定為2(取值範圍:0~255)。這一部分的最終結果格式為:2E127,即範圍-127~128。另外,標準中,還規定了,當指數位8位全0或全1的時候,浮點數為非正規形式(這個時候尾數不一樣了),所以指數位真正範圍為:-126~127。)

127用來作2的指數,為2^127,約等於 1.7014*10^38, 而我們知道,floa示數範圍約為- 3.4*10^38-------3.4*10^38, 這是因為尾數都為1時,即1.11..11約為2,因此浮點數的範圍就出來了.

<4>double與float類似,原理一樣,只不過

 符號位(S):1bit    指數位(E):11bit    尾數位(M):52bit

double的值 = (1)S(2E1023)(1.M)

叄:

char型別是用兩個位元組來表示,使用的是Unicode編碼,所以可以正常表示中文字元。兩個位元組一共十六位,又因為沒有符號位,都是數值位的原因,所以表值範圍是從:0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 (65535)

所以char型別的表值範圍是從 0 ~ 2^16-1


注意:以上是經查驗許多資料得出的,也有引用一些覺得寫的好的話語句,有不詳細或者錯誤的地方,還請斧正。。