計算機的世界:[-bit之魂-]
這裡就是這樣的世界,這裡的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=01+0=1 0+1=1 1+1=10天然與 二進位制乘法:0*0=01*0=0 0*1=0 1*1=1天然或 複製程式碼
4、進位制轉化
這裡我提個問題,來想一下:
是不是所有的十進位制實數都能轉化成二進位制?
是不是所有的其他進位制實數都能轉化成十進位制?
4.1.其他進位制轉化為10進位制
一氣化三清,公式走起

R:基數(進位制) i:數字的位置 權:R的i次方 n:整數位數-1 m:小數位數 ------------------345.6 十進位制 --------------------------- 3456 ↓↓↓↓ 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^2K=3 對於4而言:i=1權:10^1K=4 對於5而言:i=0權:10^1K=5 對於5而言:i=-1權:10^-1K=6 ------------------345.6八進位制轉10進位制 --------------------------- 3456 ↓↓↓↓ 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^2K=3 對於4而言:i=1權:8^1K=4 對於5而言:i=0權:8^1K=5 對於5而言:i=-1權:8^-1K=6 ---------------11001.1二進位制轉10進位制 -------------------------- 110011 ↓↓↓↓↓↓ 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^4K=1 對於1而言:i=3權:2^3K=1 對於0而言:i=2權:2^2K=0 對於0而言:i=1權:2^1K=0 對於1而言:i=0權:2^1K=1 對於1而言:i=-1權:2^-1K=1 二進位制--->十進位制:權值相加 複製程式碼
4.2.十進位制轉換成二進位制
--------------十進位制49轉換二進位制----------------------- --------------------- 權值 49 / 2 = 24 ······12^0 = 1 24 / 2 = 12 ······0--- 12 / 2 = 6······0--- 6 / 2 = 3······0--- 3 / 2 = 1······12^4 = 16 1 / 2 = 0······12^5 = 32 --倒取-->110001:小學老師告訴我這樣轉化,到現在我也不明白why? 十進位制整數可以和二進位制整數一一對應,那小數呢? --------------十進位制0.8125轉換二進位制----------------------- ---------------------------- 權值 0.8125 * 2 =1.62512^-1=0.5 0.625* 2 =1.2512^-2=0.25 0.25* 2 =0.50--- 0.5* 2 =112^-4=0.0625 0* 2 =00--- over 0.5+0.25+0.0625 = 0.8125 ---準確無誤,這老師可沒教過 --------------十進位制0.6531轉換二進位制----------------------- ---------------------------- 權值 0.6531 * 2 =1.306212^-1=0.5 0.3062 * 2 =0.61240--- 0.6124 * 2 =1.224812^-3=0.125 0.2248 * 2 =0.44960--- 0.4496 * 2 =0.89920--- 0.8992 * 2 =1.798412^-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 八進位制1273. 64 形象化0010 1011 1011.1101 十六進位制2111113------>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]0x000006a91705 &0000 0000 0000 0000 0100 0100 1011 0101[b]0x000044b517589 --------------------------- 0000 0000 0000 0000 0000 0100 1010 0001[c]0x000004a11185 例子:d = a | b 0000 0000 0000 0000 0000 0110 1010 1001[a]0x000006a91705 |0000 0000 0000 0000 0100 0100 1011 0101[b]0x000044b517589 --------------------------- 0000 0000 0000 0000 0100 0110 1011 1101[d]0x000046bd18109 例子:e = ~a 0000 0000 0000 0000 0000 0110 1010 1001[a]0x000006a91705 ~ 1111 1111 1111 1111 1111 1001 0101 0110[e]0xfffff956-1706 例子:f = a ^ b 0000 0000 0000 0000 0000 0110 1010 1001[a]0x000006a91705 ^0000 0000 0000 0000 0100 0100 1011 0101[b]0x000044b517589 --------------------------- 0000 0000 0000 0000 0100 0010 0001 1100[f]0x0000421c16924 複製程式碼
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]0x000006a91705 0000 0000 0000 0000 0000 0110 1010 1001<---移位 0000 0000 0000 0000 0110 1010 1001 0000[g]0x00006a9027280=1705*2^4 例子:h = a >> 4 0000 0000 0000 0000 0000 0110 1010 1001[a]0x000006a91705 0000 0000 0000 0000 0000 0110 1010 1001<---移位 0000 0000 0000 0000 0000 0000 0110 1010[g]0x0000006a27280=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]0x000006a91705 &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]0x000044b517589 &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 10010x0000b5a9 強轉成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.漢字(及其他語言字元)的編碼
一多,二雜,三歧義
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 bit1 KB = 1024 B = 8192 bit 1 MB = 1024 KB1 GB = 1024 MB1TB = 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雙精度浮點4個位元組、有符號、小數符號位: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----看到這裡,我在此感謝你的喜歡與支援
