變量和數據類型難舍難分,思考了好久,得出下面這個結論:
變量是內存中的一個存儲區域。而數據類型的定義決定了這塊存儲區域的大小。【變量與數據類型的關系】
為什么需要定義變量存儲區域的大小?
以結果為導向來分析:
Java的整數類型分為4種:byte,short,int,long。
四種的區別在於占用的存儲空間不一樣。
byte占用1個字節,short占用2個字節,int占用4個字節,而long占用8個字節。
什么是字節?
字節是一種存儲單位的度量。1個字節等於8位。
什么是位呢?
位可以理解為計算機的最小單位:0或者是1。也就是是說1個字節是8個0和1的排列組合:
比如說:00000000,00000001,00000011,......11111111。
那么在這種情況下1個字節可以表示多大的數呢?
00000000轉換為十進制依然是0,11111111轉換為十進制是255。
轉換工具:https://tool.lu/hexconvert/
也就是說,一個字節最大可以表示255而最小1可以表示0。
這是無符號位的情況,如果8位表示正數和負數,那么8位可以表示的范圍是多大呢?
通常情況下,用第一位來表示正負【0為正,1為負】,這樣算下來8位可以表示的范圍是-127到+127。
歷史長河中,補碼登場
上述引入符號位的8位二進制數可以理解為原碼。對於正數來說,原碼就是補碼,而對於負數來說,保留符號位,其他原碼按位取反加1所得即為補碼。補碼的出現使得加減法只有加法,簡化了計算結構,提高運算速度。
那么8位的情況下,用補碼來衡量,可以表達的范圍是-128--127。
為什么是-128???(按照補碼計算)
10000001到11111111表示的范圍是1到127,01111110到00000001表示的范圍是-1到-127。
而00000000屬於負數,按位取反加1的結果是10000000表示的數值是-128,但是00000000是負數。
所以8位二進制數在計算機里存儲的范圍是-128--127。
回到剛剛字節的問題,1字節等於8位而八位可以表示-128--127。這是byte類型的表示范圍。
那如果我想用計算機計算1000加上1000,byte明顯是不可用的。因為byte表示不了1000這個數值。
而short類型的存儲空間為2個字節,也就是16位。對於short數據類型來說,能表示多大的數呢?
根據8位的表示范圍推算:- 2的15次方到2的15次方-1=={-32768--32767}
以此類推,int為4個字節,long為8個字節,能表示的數更大。
Java通過定義變量的類型來規定變量的內存空間大小,通過階梯式的定義,既有滿足小數值運行的byte類型,也有支持大數值運算的long類型。這樣不僅滿足運算的最大支持(long),同時也能節省系統內存資源(byte)。
總結:數據類型的區分是一種系統資源分配優化的方案。
