雜篇:計算機的世界:[-bit之魂-]

張風捷特烈發表於2019-02-15

這裡就是這樣的世界,這裡的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、先天八卦 (-吹牛的絕佳資本-)

道有言:易生太極,太極生兩儀,兩儀生四象,四象生八卦 。
先天八卦還是蠻好玩的,至於洛書和河圖的九宮和後天八卦...

雜篇:計算機的世界:[-bit之魂-]

當把陰(斷橫)看做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人
複製程式碼

六位.jpg

這就有意思,來了50000人我總不能在天上寫個50000吧,
兩種狀態和六個變化點,再結合狀態獲取的途徑,烽火狼煙確實實現了資訊的傳遞
但功勞是烽火狼煙嗎,是二進位制嗎? 烽火狼煙只是途徑,而二進位制只是規則。

其是本質:編碼和解碼,曾經我一度不解為什麼要編解碼?
看起來編解碼似乎是一個很愚蠢的事:
可識別資訊轉了一大圈又變成了可識別資訊,還要額外定製編碼的規則   
就像把一個圖片拆成拼圖,再花費時間拼出來一樣,有什麼意義呢?
複製程式碼

編解碼.png

第一優勢:加密 
不可直接識別資訊其中隱含著[有人可以識別的意思] 
傳遞資訊的過程中保證了資訊的相對安全[避免不知道規則的人讀取或修改] 

第二優勢:可操作
這個優勢可以說改變了一個時代,便是我們當今時代    
人類定製了[編譯規則]與[作業系統]來當翻譯官,這兩者是人類不能及的  
但我們有聰明才智:
程式設計師--->寫程式碼-->編譯成二進位制-->作業系統讀取二進位制指令--->作業系統執行
關鍵就在[編譯成的二進位制]可以在[作業系統]執行,讓使用方感受科技的時代
複製程式碼

編解碼.png

說了那麼多,想表達一點:變化可以附加資訊


二、進位制相關

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進位制

一氣化三清,公式走起

進位制轉換.png

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^1    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 個正整數

byte.png


2.加入符號

對於整數而言要有符號,java中的byte是帶有符號(+或-)的,於是要扣除一位
就像烽火狼煙無法表示友方來軍多少人,可以扣除一個作為友方來軍體還是敵方來軍
所以就7個烽火臺有數字價值,好處是效用增加,壞處是表示的數範圍減小
能夠表示-2^7 ~ 2^7-1 即(-128 ~ 127)個正整數

符號位.png


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
複製程式碼

原始碼反碼與補碼.png

減法的計算.png


4.小數的表示:float為例

小數.png

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個二進位制便可以對映
類比烽火狼煙,由變化對映出數字。這裡對映出字元,理念是一致的,即用變化承載資訊

編碼.png

上面的高三位(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碼.jpg

標準ASCII碼使用了七位,但會預留一位作為校驗位
IBM對ASCII碼進行了擴充,攻256個字元,屬於擴充套件ASCII碼(非標準)


2.漢字(及其他語言字元)的編碼

符號型的文字,如漢字、日文、韓文這就複雜了:一多,二雜,三歧義
7個位元組128個空間肯定不夠用,那就增加變化唄,再來8個位元組
Unicode使用兩個位元組即16位來對映字元,一共2^16種,即65 536

Unicode.png

然後發現還是不怎麼夠用,再擴充? 然後UTF-32
這下肯定夠了容量 4 294 967 296 個,但是也太浪費了吧!
我要裝個a,用128的籃字就行了,你給我個能裝42億的籃子?受寵若驚...

utf-32.png

於是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();
    }
}
複製程式碼

utf-8和gbk比較.png

utf-8和gbk.png


4.計算機怎麼識別字的

這個字串用utf-8編碼轉化為位元組陣列,可看到是[-27, -68, -96]三個數
這三個數又代表什麼?

String str = "張";
System.out.println(Arrays.toString(str.getBytes("utf-8")));
//[-27, -68, -96]
複製程式碼

用計算器檢視十進位制數的位元組型的二進位制,可以看到:

計算器檢視位元組二進位制.png

雜篇:計算機的世界:[-bit之魂-]


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位元組嗎?

位元組.png

位元組的進位制轉化:
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萬多位
也就是說要近一億個烽火臺才能表達出這張圖片的資訊?

圖片資訊.png

現在類比一下:(巨集觀來看,半斤八兩的就不計較了)
人共約有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?

問題.png

|---我不淡定了  測試一下
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.我們就是喜歡校驗的人

畢竟實踐是檢驗真理的唯一標準

檢驗.png

double.png

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.更多關於我
筆名 QQ 微信
張風捷特烈 1981462002 zdl1994328

我的github:github.com/toly1994328
我的簡書:www.jianshu.com/u/e4e52c116…
我的掘金:juejin.im/user/5b42c0…
個人網站:www.toly1994.com

3.宣告

1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大程式設計愛好者共同交流
3----個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
4----看到這裡,我在此感謝你的喜歡與支援

icon_wx_200.png

相關文章