這裡就是這樣的世界,這裡的1 + 1 = 10 --二進位制物語
儒仁慈世安家業,墨守規矩自方圓。
兵戈鐵馬平天下,法理束欲定千秋。
佛釋惡業普渡生,道化萬物共長存。
諸子百家何為首? 且問君心何所求。
---- 張風捷特烈《求》 2019.2.15
複製程式碼
零、前言
關於數字化個人認為是計算機世界對現實世界的
對映
(或稱取樣或模擬)。
現實世界包括客觀存在
和人類文明衍生物
(自然科學和廣義文學)。
數字化就是將這些對映為二進位制資料。本文觀點為個人體悟總結,僅供參考
本文包括
1.散扯引入一些概念和個人體悟
2.進位制及其轉化的相關問題
3.邏輯運算
4.字元的編解碼
5.java中的基本資料型別
複製程式碼
一、先天八卦與烽火狼煙
先宣告我不是
尊學崇術
的人,百家於我如一。
道家認為萬物皆有陰陽,這跟計算機世界一切皆有0,1
一樣。
比如現在我用的筆記軟體,你能想象出它是由一群0和1排列組合形成的嗎?
然而這些0和1可以根據操作而產互動,就像可以"活"一樣。
我曾經很多次將一個應用(手機也好,web也好,電腦也好)想象成一個獨立生命體
與一些簡單的生物而言,它們也有生命體徵,下面類比一下:
複製程式碼
對比類別 | 生物 | 應用程式 |
---|---|---|
生存空間 | 地球 | 計算機系統(手機、電腦及智慧終端) |
資源 | 地球提供 | 計算機系統提供 |
食物 | 可消化的能量體 | 可處理的資料體 |
消化 | 原生食物-->可用能量 | 原生資料-->可用資料 |
廢物 | shi(化驗看健康狀況) | log (分析看健康狀況) |
行為 | 唱歌,做作業,看小說... | 播放音樂,放視屏,顯示小說... |
外觀 | 化妝,換髮型,換衣服... | 美化UI,齊劉海?,換膚... |
收藏品 | 古董,金錢,武器... | 快取檔案cache |
誕生 | 父母 | Coder |
家族優勢 | 富二代?(金錢支援) | 大佬公司的新產品(技術支援) |
生態群 | 娛樂圈, 教育界,學生黨... | 播放相關,教育相關,遊戲類... |
最廣闊存在 | 無限空間(宇宙) | 無限記憶體(不可描述) |
最底層表現形式 | 不可描述(元素/分子?) | 0 和 1 |
1、先天八卦 (-吹牛的絕佳資本
-)
道有言:
易生太極,太極生兩儀,兩儀生四象,四象生八卦 。
先天八卦還是蠻好玩的,至於洛書和河圖的九宮和後天八卦...
當把陰(斷橫)看做0,陽(連橫)看做 1,自下而上來表示
看過俠嵐的應該比較熟悉(我都忍不住說絕招了...)
兩儀:一組陰陽變化
陽 1
陰 0
四象:在兩儀之上新增陰陽變化
太陽 11 陽
少陽 10 陽
太陰 00 陰
少陰 01 陰
八卦:在四象之上新增陰陽變化
天 乾 111 南 三連 一 金 太陽
澤 兌 110 東南 上缺 二 金 太陽
火 離 101 東 中虛 三 火 少陽
雷 震 100 東北 仰盂 四 木 少陽
風 巽 011 西南 下斷 五 木 少陰
水 坎 010 西 中滿 六 水 少陰
山 艮 001 西北 覆碗 七 土 太陰
地 坤 000 北 六斷 八 土 太陰
複製程式碼
在八卦之上再新增陰陽變化,就形成64卦,如果萬物都由陰陽生成
那麼我們的世界也是二進位制的變化?細思恐極...
這裡並不是故弄玄虛,只是想說明一下二進位制的變化力
2.烽火狼煙
小學的那道題印象深刻(具體資料當然記不清了):
一個城池邊防有六座烽火臺,通過狼煙來通知軍隊敵軍人數,
以二進位制表示:點菸的代表1,沒點的代表0 ,化成十進位制後的1000倍即是敵軍人數
下面敵軍來了多少人?
110010 = 2^5+2^4+2^1=32+16+2=50 答:來了50000人
複製程式碼
這就有意思,來了50000人我總不能在天上寫個50000吧,
兩種狀態和六個變化點,再結合狀態獲取的途徑,烽火狼煙確實實現了資訊的傳遞
但功勞是烽火狼煙嗎,是二進位制嗎? 烽火狼煙只是途徑,而二進位制只是規則。
其是本質:編碼和解碼,曾經我一度不解為什麼要編解碼?
看起來編解碼似乎是一個很愚蠢的事:
可識別資訊轉了一大圈又變成了可識別資訊,還要額外定製編碼的規則
就像把一個圖片拆成拼圖,再花費時間拼出來一樣,有什麼意義呢?
複製程式碼
第一優勢:加密
不可直接識別資訊其中隱含著[有人可以識別的意思]
傳遞資訊的過程中保證了資訊的相對安全[避免不知道規則的人讀取或修改]
第二優勢:可操作
這個優勢可以說改變了一個時代,便是我們當今時代
人類定製了[編譯規則]與[作業系統]來當翻譯官,這兩者是人類不能及的
但我們有聰明才智:
程式設計師--->寫程式碼-->編譯成二進位制-->作業系統讀取二進位制指令--->作業系統執行
關鍵就在[編譯成的二進位制]可以在[作業系統]執行,讓使用方感受科技的時代
複製程式碼
說了那麼多,想表達一點:變化可以附加資訊
二、進位制相關
1.我與二進位制
小學看二進位制,不是1就是0唄,我蒙一下還有一半概率!
中學看二進位制,覺得有點意思,不是1就是0,誰想出來的,這麼無聊!
高學看二進位制,面無表情...二進位制就二進位制唄,管我甚事,反正我會算!
大學看二進位制,不聽不聽,王八唸經...!
現在看二進位制,擦,哲學啊!
複製程式碼
2.狀態與變化點
一種機制的變化總和=
狀態的變化點次方
道家:
狀態:陰陽
變化點:爻 如八卦是陰陽的三種變化,稱為三爻 , 兩儀即 二爻
計算機:
狀態:0 , 1 (高電平1和低電平0)
變化點:位 如一個int是0,1的32種變化,稱為32位,boolean即 1位(真假)
|--為什麼狀態和變化這麼重要? 拿烽火狼煙來說,能用十進位制嗎?
答案:能 ! 只要規則定製完善即可,比如九種顏色的煙代表1~9,0代表不點
這樣就能形成10種狀態,也就是十進位制,6座烽火臺可以表示0~999999中的任意一個
但是成本太高,可行性也很低;點與不點是兩種天然的狀態,幹嘛非要瞎折騰
111111 最大表示 63(即2^6-1) 這和 999999(即10^6-1),兩者的資訊量差距還是非常大的
複製程式碼
3.為什麼計算機非要用二進位制
天時-地利-人和
天時:電氣時代的來臨,人類掌握了電的使用,機械和電力結合的歷史洪流
地利:二進位制的物理可實現(高低電平)、邏輯運算能力、結構與運算規則簡單
人和:人才輩出,各個學科都誕生出一批大師,學術氛圍...
二進位制加法:0+0=0 1+0=1 0+1=1 1+1=10 天然與
二進位制乘法:0*0=0 1*0=0 0*1=0 1*1=1 天然或
複製程式碼
4、進位制轉化
這裡我提個問題,來想一下:
是不是所有的十進位制實數都能轉化成二進位制?
是不是所有的其他進位制實數都能轉化成十進位制?
4.1.其他進位制轉化為10進位制
一氣化三清,公式走起
R:基數(進位制)
i:數字的位置
權:R的i次方
n:整數位數-1
m:小數位數
------------------345.6 十進位制 ---------------------------
3 4 5 6
↓ ↓ ↓ ↓
3*10^2 + 4*10^1 + 5*10^0 + 6*10^-1
300 + 40 + 5 + 0.6 = 345.6
基數 R=10; n=2; m=1
對於3而言:i=2 權:10^2 K=3
對於4而言:i=1 權:10^1 K=4
對於5而言:i=0 權:10^0 K=5
對於5而言:i=-1 權:10^-1 K=6
------------------345.6八進位制轉10進位制 ---------------------------
3 4 5 6
↓ ↓ ↓ ↓
3*8^2 + 4*8^1 + 5*8^0 + 6*8^-1
192 + 32 + 5 + 0.75 = 229.75
基數 R=8; n=2; m=1
對於3而言:i=2 權:8^2 K=3
對於4而言:i=1 權:8^1 K=4
對於5而言:i=0 權:8^1 K=5
對於5而言:i=-1 權:8^-1 K=6
---------------11001.1二進位制轉10進位制 --------------------------
1 1 0 0 1 1
↓ ↓ ↓ ↓ ↓ ↓
1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 + 1*2^-1
16 + 8 + 0 + 0 + 1 + 0.5 = 25.5
基數 R=2; n=4; m=1 自左到右
對於1而言:i=4 權:2^4 K=1
對於1而言:i=3 權:2^3 K=1
對於0而言:i=2 權:2^2 K=0
對於0而言:i=1 權:2^1 K=0
對於1而言:i=0 權:2^1 K=1
對於1而言:i=-1 權:2^-1 K=1
二進位制--->十進位制:權值相加
複製程式碼
4.2.十進位制轉換成二進位制
--------------十進位制49轉換二進位制-----------------------
--------------------- 權值
49 / 2 = 24 ······1 2^0 = 1
24 / 2 = 12 ······0 ---
12 / 2 = 6 ······0 ---
6 / 2 = 3 ······0 ---
3 / 2 = 1 ······1 2^4 = 16
1 / 2 = 0 ······1 2^5 = 32
--倒取-->110001 :小學老師告訴我這樣轉化,到現在我也不明白why?
十進位制整數可以和二進位制整數一一對應,那小數呢?
--------------十進位制0.8125轉換二進位制-----------------------
---------------------------- 權值
0.8125 * 2 = 1.625 1 2^-1=0.5
0.625 * 2 = 1.25 1 2^-2=0.25
0.25 * 2 = 0.5 0 ---
0.5 * 2 = 1 1 2^-4=0.0625
0 * 2 = 0 0 --- over
0.5+0.25+0.0625 = 0.8125 ---準確無誤,這老師可沒教過
--------------十進位制0.6531轉換二進位制-----------------------
---------------------------- 權值
0.6531 * 2 = 1.3062 1 2^-1=0.5
0.3062 * 2 = 0.6124 0 ---
0.6124 * 2 = 1.2248 1 2^-3=0.125
0.2248 * 2 = 0.4496 0 ---
0.4496 * 2 = 0.8992 0 ---
0.8992 * 2 = 1.7984 1 2^-6=0.03125
.... 無窮盡
0.5+0.125+0.03125 = 0.65625 ≈ 0.6531
這就更玄乎了...竟然無窮盡,所以這便是計算機中小數的瑕疵
複製程式碼
4.3.二進位制與八進位制十六進位制間的轉化
小數對二進位制來說是個無法磨滅的瑕疵,也許有什麼二進位制的無限不迴圈(迴圈)小數也說不定
我認為數是美的,瑕疵只是我們還無法忍識的另一種美的存在形式,2,8,16完美轉化
每一個八進位制數可以由三個二進位制數表示
二進位制 1010111011.1101
形象化 001 010 111 011 . 110 100
八進位制 1 2 7 3 . 6 4
形象化 0010 1011 1011.1101
十六進位制 2 11 11 13------>2BB.D
複製程式碼
四、計算機中數的表示
1.無符號
結合烽火狼煙,相當於有八個烽火臺,每個烽火臺有2個狀態(0,1)
能夠表示0~ 2^8-1
個正整數
2.加入符號
對於整數而言要有符號,java中的byte是帶有符號(+或-)的,於是要扣除一位
就像烽火狼煙無法表示友方來軍多少人,可以扣除一個作為友方來軍體還是敵方來軍
所以就7個烽火臺有數字價值,好處是效用增加,壞處是表示的數範圍減小
能夠表示-2^7 ~ 2^7-1 即(-128 ~ 127)
個正整數
3.減法: byte 為例
計算機無法直接做減法,但是加法也可以變成減法
今天剛好發生了一件事來表述:
早上我做公交車,看文章太專注,TM做過了兩站,
假如公交車到終點時會從時空蟲洞回到起點(就當是3019年的公交吧……)。
公交車一共19站,我當時在18站,目的地在16站
有兩個選擇,
--->下來往回走兩站,18-2=16
--->目的地也可以看做在第16+19=35 站
18+ ? = 35,也就是再坐17站
即-2和+17有同樣的效果,就稱17是-2的補碼。這就是計算機減法的思想支援。
顯而易見:在這個運算體系中:
原碼 -2
補碼 17
18-2 = 18+17 都能到第16站
具有這樣週期性的有很多,即到頭重新數,時鐘,星期,日期,簡諧運動的振幅等
複製程式碼
byte a = 17;
byte b = -5;
System.out.println(a + b);//12
複製程式碼
4.小數的表示:float為例
7.25(十進位制) = 111.01(二進位制 )
111.01(二進位制)=1.1101*2^2(二進位制) 類比科學計數法
符號位:0
階碼:2 + 127 ---二進位制---> 10000001
尾數:1101
|---在java中可用以下程式碼驗證:記得補滿32位
float a = 7.25f;
int b=Float.floatToIntBits(a);
String string = Integer.toBinaryString(b);
System.out.println(string);
//0100 0000 1110 1000 0000 0000 0000 0000
複製程式碼
四、邏輯控制
1、四個位運算子
隨便寫了幾個值,眼都瞅花了...
位與:& 兩個都是1為1
位或:| 只要有1就是1
位非:~ 全取反
位異或:^ 兩個都不一樣為1
例子:c = a & b
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
& 0000 0000 0000 0000 0100 0100 1011 0101 [b] 0x000044b5 17589
---------------------------
0000 0000 0000 0000 0000 0100 1010 0001 [c] 0x000004a1 1185
例子:d = a | b
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
| 0000 0000 0000 0000 0100 0100 1011 0101 [b] 0x000044b5 17589
---------------------------
0000 0000 0000 0000 0100 0110 1011 1101 [d] 0x000046bd 18109
例子:e = ~a
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
~
1111 1111 1111 1111 1111 1001 0101 0110 [e] 0xfffff956 -1706
例子:f = a ^ b
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
^ 0000 0000 0000 0000 0100 0100 1011 0101 [b] 0x000044b5 17589
---------------------------
0000 0000 0000 0000 0100 0010 0001 1100 [f] 0x0000421c 16924
複製程式碼
2.java中校驗上面位運算的例子
public static void main(String[] args) {
int a = 0x000006a9;//0000 0000 0000 0000 0000 0110 1010 1001
int b = 0x000044b5;//0000 0000 0000 0000 0100 0100 1011 0101
int c = 0x000004a1;//0000 0000 0000 0000 0000 0100 1010 0001
int d = 0x000046bd;//0000 0000 0000 0000 0100 0110 1011 1101
int e = 0xfffff956;//1111 1111 1111 1111 1111 1001 0101 0110
int f = 0x0000421c;//1111 1111 1111 1111 1111 1001 0101 0110
System.out.println(a);//1705
System.out.println(b);//17589
//位與
System.out.println(a & b);//1185
System.out.println(c);//1185
//位或
System.out.println(a | b);//18109
System.out.println(d);//18109
//位非
System.out.println(e);//-1706
System.out.println(~a);//-1706
//位異或
System.out.println(f);//-1706
System.out.println(a ^ b);//-1706
}
複製程式碼
3.移位操作
左移n位相當於乘以2的n次方
a<<n
右移n位:a>>n
例子:g = a << 4
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
0000 0000 0000 0000 0000 0110 1010 1001 <---移位
0000 0000 0000 0000 0110 1010 1001 0000 [g] 0x00006a90 27280=1705*2^4
例子:h = a >> 4
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
0000 0000 0000 0000 0000 0110 1010 1001 <---移位
0000 0000 0000 0000 0000 0000 0110 1010 [g] 0x0000006a 27280=106
---->[程式碼驗證]---------------
int g = 0x00006a90;//0000 0000 0000 0000 0110 1010 1001 0000
int h = 0x0000006a;//0000 0000 0000 0000 0110 1010 1001 0000
System.out.println(g);//27280
System.out.println(a << 4);//27280
System.out.println(h);//106
System.out.println(a >> 4);//106
複製程式碼
4.需要注意的幾種套路:
1.將兩個int值得低八位(最後一個位元組)拼成一個short
取低8位: int 值 & 0x000000FF ----看一下挺好理解的
0000 0000 0000 0000 0000 0110 1010 1001 [a] 0x000006a9 1705
& 0000 0000 0000 0000 0000 0000 1111 1111
-------------------------------------------------
0000 0000 0000 0000 0000 0000 1010 1001 [i] 0x000000a9
取低8位後左移8位: int 值 & 0x000000FF
0000 0000 0000 0000 0100 0100 1011 0101 [b] 0x000044b5 17589
& 0000 0000 0000 0000 0000 0000 1111 1111
-------------------------------------------------
0000 0000 0000 0000 0000 0000 1011 0101 [j] 0x000000b5
0000 0000 0000 0000 1011 0101 0000 0000 [j] 左移8位 0x0000b500
0000 0000 0000 0000 0000 0000 1010 1001 [i] 0x000000a9
+ 0000 0000 0000 0000 1011 0101 0000 0000 [j] 0x0000b500
-------------------------------------------------
0000 0000 0000 0000 1011 0101 1010 1001 0x0000b5a9
強轉成short完成任務:1011 0101 1010 1001
2.當 n = 2^i 時,x % n = (n - 1) & x (這是看HashMap原始碼學到的),例如:
至於原理沒研究過,但位運算要比%運算要快,所以後者有優勢,HashMap裡便是後者
int x = 67444;
int i1 = 255 & x;//===>67444 % 255
int i2 = x % 256;//===>67444 % 256
System.out.println(i1);//166
System.out.println(i2);//166
複製程式碼
五、字元編碼
你有沒有想過這樣一個問題?
計算機檔案儲存的基礎是位元組,為什麼一個位元組(byte)是8位
1.ASCII碼
這是我能找到最清楚的ASCII碼錶了,以後有時間自己畫一幅(已加入TODO事項)
ASCII碼中字元
和控制字元
一共有128種,即2^7,用7個二進位制便可以對映
類比烽火狼煙,由變化對映出數字。這裡對映出字元,理念是一致的,即用變化承載資訊
上面的高三位(b6,b5,b4)和左邊的低四位(b3,b2,b1,b0)形成座標點,
確定了一個字元的唯一存在:如, 101 0100 --對映--> T
public static void main(String[] args) {
char T = 'T';
System.out.println((int)T);//84
System.out.println(Integer.toBinaryString(T));//1010100
}
1010100你能記住嗎? 二進位制和16進位制是一一對應的,所以0x54 就等於0b1010100
記住:字元0:0x30 字元A:0x41 字元a:0x61 常用的也就差不多了
複製程式碼
標準ASCII碼使用了七位,但會預留一位作為校驗位
IBM對ASCII碼進行了擴充,攻256個字元,屬於擴充套件ASCII碼(非標準)
2.漢字(及其他語言字元)的編碼
符號型的文字,如漢字、日文、韓文這就複雜了:
一多,二雜,三歧義
7個位元組128個空間肯定不夠用,那就增加變化唄,再來8個位元組
Unicode使用兩個位元組即16位來對映字元,一共2^16種,即65 536
然後發現還是不怎麼夠用,再擴充? 然後UTF-32
這下肯定夠了容量 4 294 967 296 個,但是也太浪費了吧!
我要裝個a,用128的籃字就行了,你給我個能裝42億的籃子?受寵若驚...
於是UTF-8閃亮登場
ASCII 碼錶:美國標準資訊交換碼 1位元組--使用:7位
ISO8859-1:拉丁碼錶。歐洲碼錶 1位元組--使用:8位
GB2312:中國的中文編碼表。 2位元組--使用:16位
GBK:GB2312升級版,增加中文 2位元組--使用:16位
Unicode:國際標準碼 2位元組--使用:16位
UTF-8:Unicode升級版 能用1個字元表示用1個字元,不然用2個,要還是不夠用,使用3個位元組
複製程式碼
3.指定編碼表寫出檔案
public class 編碼表測試 {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("UTF-8.txt"),"utf-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"gbk");
osw.write("張風toly");
osw.close();
}
}
複製程式碼
4.計算機怎麼識別張
字的
將
張
這個字串用utf-8編碼轉化為位元組陣列,可看到是[-27, -68, -96]三個數
這三個數又代表什麼?
String str = "張";
System.out.println(Arrays.toString(str.getBytes("utf-8")));
//[-27, -68, -96]
複製程式碼
用計算器檢視十進位制數的位元組型的二進位制,可以看到:
5.使用不同碼錶讀取測試
InputStreamReader isr_GBK_gbk = new InputStreamReader(new FileInputStream("GBK.txt"),"gbk");
char[] buf = new char[10];
int len = isr_GBK_gbk.read(buf);
System.out.println(new String(buf, 0, len));//張風toly
InputStreamReader isr_GBK_utf8 = new InputStreamReader(new FileInputStream("GBK.txt"),"utf-8");
char[] buf2 = new char[10];
int len2 = isr_GBK_utf8.read(buf2);
System.out.println(new String(buf2, 0, len2));//�ŷ�toly
InputStreamReader isr_UTF8_utf8 = new InputStreamReader(new FileInputStream("UTF-8.txt"),"utf-8");
char[] buf4 = new char[10];
int len4 = isr_UTF8_utf8.read(buf4);
System.out.println(new String(buf4, 0, len4));//張風toly
InputStreamReader isr_UTF8_gbk = new InputStreamReader(new FileInputStream("UTF-8.txt"),"gbk");
char[] buf3 = new char[10];
int len3 = isr_UTF8_gbk.read(buf3);
System.out.println(new String(buf3, 0, len3));//寮犻toly
複製程式碼
6.位bit與位元組byte
位是計算機的基石,位元組是檔案的基石
如果說位是0,1的陰陽變化?, 位元組便是256卦象,而這256卦象便是檔案的最小單元
256卦象是多少爻呢 ? 8 ,也就是 8 個位來記錄這256種變化
所有檔案都是以位元組為單位的,你見過哪裡有10000.5位元組嗎?
位元組的進位制轉化:
1 B = 8 bit 1 KB = 1024 B = 8192 bit
1 MB = 1024 KB 1 GB = 1024 MB 1TB = 1024 GB
複製程式碼
7.形象體感一下位元組的存在
就拿我頭像來看看吧,
1,153,744 位元組
115萬多位元組?! 也就是920萬多位
也就是說要近一億個烽火臺才能表達出這張圖片的資訊?
現在類比一下:(巨集觀來看,半斤八兩的就不計較了)
人共約有40萬億-60萬億個細胞組成,容納了大約13個數量級的細胞
如果把位類比細胞:
13個數量級的位(bit)大概是12個數量級的位元組(byte)---
12個數量級的位元組(byte)大概是 1T 四階12級:B-->KB-->MB-->GB-->T
於是乎:一個位元組在1T的硬碟裡的感覺就像一個細胞之於人體的感覺
---->[下面的表述僅代表個人觀點]-----------------------------
注意:一個位元組內只有八位(256種變化),但細胞的內部變化種類...
一般分子直徑數量級在-10 將一個分子看成立方,體積大概數量級-30
普通細胞直徑大概在:10~20μm 大概在數量級-5,將一個細胞看成立方
體積數量級大概在 -15 ,也就是一個細胞大概有15個數量級的分子
如果一個程式要形成一個獨立執行的人類系統,
在不考慮分子的變化的情況下,如果(256種變化)可以表示分子
需要至少15個數量級的 T 空間即1千萬億T,才能容納一個人的總體變化,
且不說1千萬億T的硬碟如何製造,能夠編寫出這麼大的程式嗎?
可以說人類的存在是宇宙的一個完美的bug!
--------張風捷特烈(雜談)
複製程式碼
六、再來看java的幾種資料型別
1.八仙一覽
經過上面走一遭,是不是感覺更熟悉了?
boolean 布林型別 1位元組
byte 位元組 1位元組、有符號
char 字元型 2個位元組、無符號、Unicode字元兼整數
short 短整型 2個位元組、有符號、整數
int 整型 4個位元組、有符號、整數
long 長整型 8個位元組、有符號、整數
float 浮點型 4個位元組、有符號、小數 符號位:1bit,階碼:8bit, 尾數:23bit
double 雙精度浮點 8個位元組、有符號、小數 符號位:1bit,階碼:11bit,尾數:52bit
複製程式碼
2.拋張表
型別 | 位元組數 | 位數 | 範圍 | 初始值 |
---|---|---|---|---|
boolean | 1 | 8 | true/false | false |
byte | 1 | 8 | -2^7 ~ 2^7-1 (-128 ~ 127) | 0 |
char | 2 | 16 | 0 ~ 2^16-1(0 ~ 65535) | null |
short | 2 | 16 | -2^15 ~ 2^15-1 (-32768~32717) | 0 |
int | 4 | 32 | -2^31 ~ 2^31-1 (-2147483648~2147483647) | 0 |
long | 8 | 64 | -2^63 ~ 2^63-1 | 0L |
float | 4 | 32 | ±1.4E-45 ~ ±3.4028235E38 |
0.0f |
double | 8 | 64 | ±4.9E-324 ~ ±1.7976931348623157E308 |
0.0d |
3.上面給出的是用JAVA的API獲取的
難道就沒有人疑問,float的最小值? 我看到有點蒙,Are you sure?
|---我不淡定了 測試一下
float f = -1.5f;
System.out.println(Float.MIN_VALUE > f);//true
|---Float獲取最小值可能比一個float大?
---->[Float.java]------------------
# 看來是直接定義的常量 這就有意了---程式碼註釋是最小非零整數
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
|---所以嚴格說取值範圍應該加上±號,否則不嚴謹,網上基本上都是正的
複製程式碼
4.我們就是喜歡校驗的人
畢竟實踐是檢驗真理的唯一標準
float f = 0.0 00000 00000 00000 00000 00000 00000 00000 00000 00001f;//Error
果然第46個0的時候報錯了,double就沒事
double d = 0.000000000000000000000000000000000000000000000000000000000000000000000000000001;
複製程式碼
好了,本篇沒人挺多的,如果你認真看完,一定受益頗多
而我作為作者,受益就更加豐富了,總結一下,有些東西算是理清了
後記:捷文規範
1.本文成長記錄及勘誤表
專案原始碼 | 日期 | 附錄 |
---|---|---|
V0.1-- | 2018-2-15 | 無 |
釋出名:
計算機的世界:[-bit之魂-]
捷文連結:www.jianshu.com/p/ee74ea725…
2.更多關於我
筆名 | 微信 | |
---|---|---|
張風捷特烈 | 1981462002 | zdl1994328 |
我的github:github.com/toly1994328
我的簡書:www.jianshu.com/u/e4e52c116…
我的掘金:juejin.im/user/5b42c0…
個人網站:www.toly1994.com
3.宣告
1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大程式設計愛好者共同交流
3----個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
4----看到這裡,我在此感謝你的喜歡與支援