很多人會有一個疑問, 一個用來表示小數(shù)的 float 為什么表示的范圍會比 long 還要大呢 ?
這次, 咱們就來詳細(xì)說一說這個事情
從長計議
聊到這個話題, 我們就要從計算機存儲數(shù)字這個位置說起了
計算機存儲數(shù)字的方式其實就是 : 二進制
二進制是計算機中最基本的數(shù)字存儲方式,所有的數(shù)字都是以0和1的二進制數(shù)表示的罐柳。計算機中的內(nèi)存和處理器等硬件組件都是以二進制為基礎(chǔ)來設(shè)計的狰住。計算機通過將數(shù)字轉(zhuǎn)換成二進制數(shù)催植,然后以二進制形式存儲在內(nèi)存中。
進制 : 其實就是我們數(shù)數(shù)的時候進位的方法
也就是說, 我們的數(shù)字包括其他內(nèi)容在內(nèi), 都會轉(zhuǎn)變?yōu)槎M制的形式存儲起來
例子:
一個數(shù)字是 6, 轉(zhuǎn)化成二進制以后就是 110
那么在計算機存儲的時候, 其實存儲的就是 110
單位
我們除了知道存儲方式以后, 還要知道一個事情, 就是計算機的存儲單位
剛才我們說了, 每一個數(shù)據(jù)其實都是按照二進制的形式存儲的
在計算機的二進制存儲中缓苛,每一個二進制數(shù)位稱為一個位(bit), 每8位二進制數(shù)被稱為一個字節(jié)(byte),通常表示為8個0和1的序列
字節(jié)(B), 就是我們通常計算機中的一種存儲單位而已, 我們一般的計算機都是按照字節(jié)來存儲的
例子 :
有一個數(shù)字是 0, 二進制轉(zhuǎn)換以后是 0, 那么就會占一個 位
有一個數(shù)字是 1, 二進制轉(zhuǎn)換以后是 1, 那么也是會占一個 位
但是我們思考一下, 存儲的時候, 就是占了兩個位, 可是他倆不能放在一起存儲啊
一旦放到一起, 到底是 01 還是 10 還是 一個 0 和 一個 1 呢 ?
所以, 所有的數(shù)據(jù)存儲都會按照自己來存儲, 也就是 byte
換句話說, 就是一個數(shù)字哪怕是一個位, 那么存儲的時候也會占據(jù)一個字節(jié)的位置
也就是說 : 一個數(shù)字是 1, 二進制以后是 1, 因為要占據(jù)一個字節(jié)
會把這個 1 變成 0000 0001 這樣的形式來存儲
這樣就剛剛好占據(jù)了一個字節(jié)的位置
根據(jù)上面的說法來看, 一個自己(byte) 存儲的最大范圍就是
1111 1111 也就是 255 這個數(shù)字
但是我們考慮到還有正負(fù)數(shù)的關(guān)系, 所以一個字節(jié)里面還要有一位表示正負(fù)的位
所以, 其實就是 -128 ~ 127 之間的取值范圍
問題來了
那么 -129 或者 300 這些數(shù)字怎么存儲呢 ?
不同的數(shù)字類型
既然一個字節(jié)只能存儲 -128 ~ 127 范圍內(nèi)的數(shù)字, 那么其他的數(shù)字怎么辦呢, 不存了嗎 ?
這個時候, 我們就要來聊一下數(shù)字的存儲方式了(以 Java 或者 C 或者 C++ 語言為例)
byte
如果以 byte 定義一個數(shù)字, 就是告訴你的電腦, 我要申請一個字節(jié)的位置存儲數(shù)據(jù)
那么電腦會分配給你一個字節(jié)來存儲當(dāng)前數(shù)據(jù), 所以只能存儲 -128 ~ 127 之間的數(shù)字
short
如果以 short 定義一個數(shù)字, 就是告訴你的電腦, 我要申請兩個字節(jié)的位置來存儲數(shù)據(jù)萌壳,那么電腦會分配給你兩個字節(jié)來存儲當(dāng)前數(shù)據(jù)缤骨,一個字節(jié)有 8 個位, 那么兩個字節(jié)就是 16 個位。
換句話說, 如果以 byte 的形式存儲數(shù)字1, 那么是 0000 0001
如果以 short 來存儲一個數(shù)字1, 那么是 0000 0000 0000 0001
所以 short 存儲數(shù)字的最大范圍就是 -32,768 到 32,767
int
同樣的道理, int 也可以用來定義存儲一個數(shù)字 int 表示的數(shù)字會占四個字節(jié)的位置, 也就是 32 位
取值范圍就是 -2,147,483,648 到 2,147,483,647
long
同樣的道理long 表示的數(shù)字會占八個字節(jié)的位置, 也就是 64 位
取值范圍就是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
你看這樣就好理解的多了
long 類型
long 這個類型很有意思,在不同的解析器或者編譯器內(nèi), long 的表示形式不一樣笋鄙,上面我們說的,long 在 java, c, c++ 內(nèi)都是表示 64位, 也就是 8 個字節(jié)的位置铐尚,但是long 在 javascript 內(nèi)宣增。
根據(jù) js 解析器來分析帖旨,long 就表示 32 的數(shù)字, 也就是占 4 個字節(jié)的位置
取值范圍就是 -2,147,483,648 到 2,147,483,647好了痒筒,
到現(xiàn)在為止, 我們知道了 long 是怎么存儲的姑蓝,接下來該到了 float 了
存儲小數(shù)
剛才說完了整數(shù), 接下來我們就來說一說小數(shù)
在計算機存儲小數(shù)的時候有兩種方法
1.定點數(shù)表示法
定點數(shù)表示法是指把小數(shù)點固定在某個位置上蒲跨,用整數(shù)來表示小數(shù)部分的一種方法。通常使用定點數(shù)表示法的情況下,小數(shù)點的位置被固定在一個確定的位置上分别,比如在小數(shù)點后一位或兩位。
例如煌往,如果將小數(shù)點固定在第一位,那么可以把小數(shù)0.123表示為整數(shù)123。如果將小數(shù)點固定在第二位院水,那么可以把小數(shù)0.123表示為整數(shù)1230。
這不是我們需要的, 就不糾結(jié)了
2.浮點數(shù)表示法
浮點數(shù)表示法其實就是浮動小數(shù)點的方法來表示一個小數(shù)
我們通常會分為單精度浮點數(shù)和雙精度浮點數(shù)
這個才是我們糾結(jié)的事情, 所以要詳細(xì)解釋一下
詳細(xì)了解一下浮點數(shù)
1.單精度浮點數(shù)
單精度浮點數(shù)的存儲占用 4 個字節(jié), 也就是 32 位
其中第一個位表示的是 符號, 也就是 正負(fù)數(shù)胰默,其中第二個到第九個這 8 位來做指數(shù)占位漏隐,最后就是尾數(shù)占 23 位
表示范圍約為 1.4E-45 到 3.4E+38青责,精度為大約7位有效數(shù)字
2.雙精度浮點數(shù)
雙精度浮點數(shù)存儲占用 8 個字節(jié), 也就是 64 位
其中第一個位表示的是 符號挺据,其中第二個到第十二個這 11 位來做指數(shù)占位,最后就是位數(shù)占 52 位
表示范圍約為 4.9E-324 到 1.8E+308爽柒,精度為大約 15 位有效數(shù)字
結(jié)論
事已至此, 我們該準(zhǔn)備的都準(zhǔn)備好了 在 JavaScript 解析器內(nèi)
long 表示的是 32 的數(shù)字, 取值范圍就是 -2,147,483,648 到 2,147,483,647
float 表示的是 32 位浮點數(shù), 因為有指數(shù)加成, 取值范圍就是 1.4E-45 到 3.4E+38
所以我們才會說, float 的取值范圍會比 long 還要大