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

這裏就是這樣的世界,這裏的1 + 1 = 10 --二進制物語java

儒仁慈世安家業,墨守規矩自方圓。
兵戈鐵馬平天下,法理束欲定千秋。
佛釋惡業普渡生,道化萬物共長存。   
諸子百家何爲首? 且問君心何所求。
                ---- 張風捷特烈《求》 2019.2.15
複製代碼

零、前言

關於數字化我的認爲是計算機世界對現實世界的映射(或稱採樣或模擬)。
現實世界包括客觀存在人類文明衍生物(天然科學和廣義文學)。
數字化就是將這些映射爲二進制數據。本文觀點爲我的體悟總結,僅供參考git

本文包括
1.散扯引入一些概念和我的體悟
2.進制及其轉化的相關問題
3.邏輯運算
4.字符的編解碼
5.java中的基本數據類型
複製代碼

1、先天八卦與烽火狼煙

先聲明我不是尊學崇術的人,百家於我如一。
道家認爲萬物皆有陰陽,這跟計算機世界一切皆有0,1同樣。程序員

好比如今我用的筆記軟件,你能想象出它是由一羣0和1排列組合造成的嗎?
然而這些0和1能夠根據操做而產交互,就像能夠"活"同樣。
我曾經不少次將一個應用(手機也好,web也好,電腦也好)想象成一個獨立生命體  
與一些簡單的生物而言,它們也有生命體徵,下面類比一下:
複製代碼
對比類別 生物 應用程序
生存空間 地球 計算機系統(手機、電腦及智能終端)
資源 地球提供 計算機系統提供
食物 可消化的能量體 可處理的數據體
消化 原生食物-->可用能量 原生數據-->可用數據
廢物 shi(化驗看健康情況) log (分析看健康情況)
行爲 唱歌,作做業,看小說... 播放音樂,放視屏,顯示小說...
外觀 化妝,換髮型,換衣服... 美化UI,齊劉海?,換膚...
收藏品 古董,金錢,武器... 緩存文件cache
誕生 父母 Coder
家族優點 富二代?(金錢支持) 大佬公司的新產品(技術支持)
生態羣 娛樂圈, 教育界,學生黨... 播放相關,教育相關,遊戲類...
最廣闊存在 無限空間(宇宙) 無限內存(不可描述)
最底層表現形式 不可描述(元素/分子?) 0 和 1

一、先天八卦 (-吹牛的絕佳資本-)

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

當把陰(斷橫)看作0,陽(連橫)看作 1,自下而上來表示
看過俠嵐的應該比較熟悉(我都忍不住說絕招了...)web

兩儀:一組陰陽變化
陽      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

說了那麼多,想表達一點:變化能夠附加信息安全


2、進制相關

1.我與二進制
小學看二進制,不是1就是0唄,我蒙一下還有一半機率!
中學看二進制,以爲有點意思,不是1就是0,誰想出來的,這麼無聊!
高學看二進制,面無表情...二進制就二進制唄,管我甚事,反正我會算!
大學看二進制,不聽不聽,王八唸經...!
如今看二進制,擦,哲學啊!
複製代碼

2.狀態與變化點

一種機制的變化總和=狀態的變化點次方bash

道家:
狀態:陰陽
變化點:爻  如八卦是陰陽的三種變化,稱爲三爻 , 兩儀即 二爻

計算機:
狀態: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.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^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
複製代碼

4、計算機中數的表示

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
複製代碼

4、邏輯控制

一、四個位運算符

隨便寫了幾個值,眼都瞅花了...

位與:&     兩個都是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
複製代碼

5、字符編碼

你有沒有想過這樣一個問題?
計算機文件存儲的基礎是字節,爲何一個字節(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


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!
                                    --------張風捷特烈(雜談)
複製代碼

6、再來看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
相關文章
相關標籤/搜索