java之二進位制與資料型別
一、各資料型別的最大值和最小值
整數:
以byte為例,我們知道,byte共有8個bit位,最大值是0111111,最小值是10000000,用十進位制來表示就是-128~127,即-2^7~2^7。
依照上面的推理方式可知
總結下表:
資料型別 |
bit位 | 取值範圍 |
byte | 8 | -2^7~2^7-1 |
short | 16 | -2^15~2^15-1 |
int | 32 | -2^32~2^32-1 |
long | 64 | -2^63~2^63-1 |
小數:
我們知道float是32位,double為64位,分別被叫做單精度和雙精度小數。但是他們的最大值卻不是透過上面的程式碼來確定的,我們用程式碼來看看它們的最大值是多少:
System.out.println("float的最大值:"+Float.MAX_VALUE);System.out.println("double的最大值:"+Double.MAX_VALUE);
執行結果:
float的最大值:3.4028235E38double的最大值:1.7976931348623157E308
透過上面的程式碼,我們知道了float的最大值為3.4*10^38,double的最大值為1.79*10^308。
那為什麼同樣是32位的int和64位的long無法表示呢?
我們來看看儲存結構:
由於二進位制比較麻煩,我們用十進位制來表示。
整數的儲存很簡單,第一位為符號位,其他剩餘位都表示數值,例如
0 | 9 | 9 | 9 |
第一位為符號位,後面的三位則均為數字位,所以,這表示的就是999。
但是小數的儲存方法就不相同:
符號位 | 指數位(階碼位) | 尾數位(小數位) |
以double第一位和整數一樣是符號位,之後的指數位共有11位,剩下的位數全部是尾數位,以double為例,double的尾數位就是52位。
還是剛才的數值:
0 | 9 | 9 | 9 |
第一位0位符號位,第一個“9”表示指數位,後面的兩個9就表示小數即0.99,那麼這個數字就是0.99*10^9。
這就是為什麼同樣位數的小數要比整數表示的數字要大。
二、精確度
我們首先用int 和float表示相同的一個數字:
int a = 12345678;float b = 12345678;System.out.println("int:"+a);System.out.println("float:"+b);
執行結果:
int:12345678float:1.2345678E7
此時,int和float的值結果是相同的,當他們表示一個更大的數時就會出現如下問題:
int a = 123456789;float b = 123456789;System.out.println("int:"+a);System.out.println("float:"+b);
執行結果:
int:123456789float:1.23456792E8
此時,float丟失了一個數字8,現在我們再用double來表示這個數字:
double c = 123456789;System.out.println("double:"+c);
執行結果:
double:1.23456789E8
我們驚奇的發現:double沒有丟失資料!
正如我們上面說的,float是32位,double為64位,float之所以出現丟失資料的顯現,是因為float的位數不足以儲存123456789,所以部分資料就丟失了,但是double有64位,小數位足以表示123456789,因此就不會發生資料丟失。
三、強制資料型別轉換
高精度->低精度
從高精度轉為低精度時會發生精度丟失的狀況,例如:
double a = 123.45;int b = (int) a;System.out.println(b);
執行結果:
123
可見,由double轉為int時,會將小數部分丟掉。
高位->低位
位數多的轉為位數少的會發生高位資料丟失,例如:
int a = 129;byte b = (byte) a;System.out.println(b);
執行結果:
-127
我們知道,int為32位,129用二進位制表示就是00000000 00000000 00000000 10000001。在強轉為byte時,由於byte只有8位,會將前24位全部舍掉,剩下的就是10000001,轉為十進位制就是-127。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2813269/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WebSocket系列之二進位制資料設計與傳輸Web
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- Java程式設計基礎03——進位制運算&資料型別&變數Java程式設計資料型別變數
- C語言02-常量、二進位制、資料型別C語言資料型別
- java基本資料型別佔位Java資料型別
- 二進位制安全_C語言中資料型別C語言資料型別
- mssql sqlserver 可以儲存二進位制資料的欄位型別詳解SQLServer型別
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- Java中的基本資料型別與引用資料型別Java資料型別
- BLOB(二進位制大物件:text、ntext或image)型別資料的操作物件型別
- Hibernate、JAVA、SQL對應二進位制、文字、影像物件型別JavaSQL物件型別
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 二進位制、十進位制與十六進位制相互轉化
- 通過二進位制頭識別檔案型別型別
- mysql 日誌之二進位制日誌MySql
- 二進位制與二進位制運算
- [大資料量]java移位運算與位運算與資料型別的儲存大資料Java資料型別
- 沉思-騰訊 PHP 面試題請寫一個函式來檢查使用者提交的資料是否為整數(不區分資料型別,可以為二進位制、八進位制、十進位制、十六進位制數字)PHP面試題函式資料型別
- java型別轉換與強制型別轉換(轉)Java型別
- 【進位制轉換】十進位制與十六進位制相互轉換方法
- java之資料型別與陣列Java資料型別陣列
- [轉]ABAP資料型別與Java資料型別的對應關係資料型別Java
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- Oracle二進位制與十進位制轉換Oracle
- 複雜二進位制資料
- Java基本資料型別和Integer快取機制Java資料型別快取
- MYSQL資料庫型別與JAVA型別對應關係MySql資料庫型別Java
- 資料欄位型別匹配型別
- C語言資料型別、變數的輸入和輸出、進位制轉換C語言資料型別變數
- Java資料型別Java資料型別
- 十進位制與二進位制互相轉換指南
- Java進階 | 泛型機制與反射原理Java泛型反射
- 關於用二進位制給byte型資料賦值賦值
- Erlang學習筆記(七)二進位制型與位語法筆記
- Java中8進位制和16進位制的表示方法Java
- 進位制詳解:二進位制、八進位制和十六進位制