一些數(shù)據(jù)在計(jì)算機(jī)中的儲(chǔ)存與表示
我們都知道,在計(jì)算機(jī)中,數(shù)據(jù)是由二進(jìn)制進(jìn)行存儲(chǔ)和讀取輸出的。那么,在計(jì)算機(jī)中,數(shù)、字符、圖片、聲音和視頻怎么用二進(jìn)制存儲(chǔ)和讀取輸出的呢?
數(shù)的存儲(chǔ)和讀取輸出
整數(shù)的存儲(chǔ)和讀取輸出
整數(shù)的存儲(chǔ)和讀取輸出應(yīng)該說(shuō)是最簡(jiǎn)答的讀取輸出方法了。如果是個(gè)正整數(shù),那就直接轉(zhuǎn)換為二進(jìn)制進(jìn)行存儲(chǔ)。如果是個(gè)負(fù)整數(shù),先把其絕對(duì)值轉(zhuǎn)換為二進(jìn)制,然后符號(hào)位為 \(1\)(代表負(fù)數(shù)),然后以其補(bǔ)碼的形式(先對(duì)非符號(hào)位取反,再對(duì)取反的結(jié)果 \(+1\))存儲(chǔ)。想要讀取輸出,對(duì)于非負(fù)數(shù),直接轉(zhuǎn)換成十進(jìn)制即可;反之,先把補(bǔ)碼變成原碼,符號(hào)位改為 \(0\),轉(zhuǎn)換為十進(jìn)制后在前面添個(gè)負(fù)號(hào)上去即可。
浮點(diǎn)數(shù)的存儲(chǔ)和讀取輸出
浮點(diǎn)數(shù),也就是小數(shù),是參照 IEEE(電氣和電子工程師協(xié)會(huì),Institute of Electrical and Electronics Engineers)的 IEEE 754 標(biāo)準(zhǔn)進(jìn)行存儲(chǔ)和讀取輸出的。其中,又劃分為單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)。兩者的差別僅在于精度,存儲(chǔ)和讀取輸出方法沒(méi)有差異。
單精度浮點(diǎn)數(shù)
用 \(32\) bit 存儲(chǔ),分成三部分:
- 符號(hào)位:占 \(1\) 位,\(0\) 讀取輸出正數(shù),\(1\) 讀取輸出負(fù)數(shù)。
- 指數(shù)位:占 \(8\) 位,為表達(dá)正負(fù)指數(shù),存儲(chǔ)指數(shù)需加偏移值 \(127\)。指數(shù)實(shí)際范圍能達(dá) \(-126\sim127\),指數(shù)域編碼值范圍是 \(1\sim254\)。\(0\) 和 \(255\) 為特殊值,用于代表非規(guī)格數(shù)、無(wú)窮大或 NaN。
- 尾數(shù)位:占 \(23\) 位。規(guī)格化尾數(shù)默認(rèn)首位為 \(1\),存儲(chǔ)省略此 \(1\),僅存小數(shù)部分。例如尾數(shù)為 \(1.011\),則存入的尾數(shù)位是 \(011\),位數(shù)不足時(shí)低位補(bǔ) \(0\)。
雙精度浮點(diǎn)數(shù)
用 \(64\) bit 存儲(chǔ),同樣分為三部分:
- 符號(hào)位:占 \(1\) 位,\(0\) 讀取輸出正數(shù),\(1\) 讀取輸出負(fù)數(shù)。
- 指數(shù)位:占 \(11\) 位,偏移值是 \(1023\),指數(shù)實(shí)際范圍為 \(-1022\sim1023\),指數(shù)域編碼 \(1\sim2046\) 對(duì)應(yīng)正常情況。\(0\) 及 \(2047\) 保留用于特殊情況。
- 尾數(shù)位:占 \(52\) 位。規(guī)格化尾數(shù)省略首位 \(1\),存儲(chǔ)小數(shù)部分。
讀取輸出方法
特殊情況定義
| 指數(shù)位為 \(0\) | 指數(shù)位為 \(255\) | |
|---|---|---|
| 尾數(shù)位為 \(0\) | \(\pm0\)(由符號(hào)位決定) | \(\pm\infty\)(由符號(hào)位決定) |
| 尾數(shù)位不為 \(0\) | 非規(guī)格化數(shù)(用于讀取輸出接近零的極小值,無(wú)隱含的首位 \(1\)) | NaN(用來(lái)讀取輸出無(wú)實(shí)效運(yùn)算結(jié)果,例如 \(\dfrac{0}{0}\)、\(\sqrt{-1}\) 等) |
表 \(1\) —— 浮點(diǎn)數(shù)特殊情況定義
字符的存儲(chǔ)和讀取輸出
我們平時(shí)用電腦,不僅僅只是會(huì)碰見(jiàn)數(shù),最常見(jiàn)的就是碰到字符對(duì)吧。那么這些字符是如何轉(zhuǎn)換為二進(jìn)制進(jìn)行存儲(chǔ)和讀取輸出的呢?
我們不難想到,可以把字符一一映射到一個(gè)數(shù)上面,然后進(jìn)行二進(jìn)制存儲(chǔ)。于是,聰明的人類就發(fā)明出了 ASCII 碼(美國(guó)信息交換標(biāo)準(zhǔn)代碼,American Standard Code for Information Interchange)。它是一套基于拉丁字母的字符編碼系統(tǒng),最初用于在計(jì)算機(jī)和通信設(shè)備之間統(tǒng)一信息交換的字符讀取輸出方式,包含了大小寫字母、數(shù)字、標(biāo)點(diǎn)符號(hào)以及控制字符等,共定義了 \(128\) 個(gè)字符(\(0\sim127\)),每個(gè)字符用 \(7\) 位二進(jìn)制數(shù)讀取輸出。

圖 \(1\) —— ASCII 碼表
比如我要存儲(chǔ) Hello, world!,那么我就查詢其 ASCII 碼表,把字符映射成整數(shù),然后轉(zhuǎn)成二進(jìn)制進(jìn)行存儲(chǔ)。想讀取輸出也很簡(jiǎn)單,只要做個(gè)逆操作:讀取二進(jìn)制,轉(zhuǎn)換為 ASCII 碼,然后看看是哪個(gè)映射到這個(gè)值的。
| 字符 | H |
e |
l |
l |
o |
, |
|
w |
o |
r |
l |
d |
! |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ASCII | \(72\) | \(101\) | \(108\) | \(108\) | \(111\) | \(44\) | \(32\) | \(119\) | \(111\) | \(114\) | \(108\) | \(100\) | \(33\) |
| 二進(jìn)制 | \(\texttt{0100 1000}\) | \(\texttt{0110 0101}\) | \(\texttt{0110 1100}\) | \(\texttt{0110 1100}\) | \(\texttt{0110 1111}\) | \(\texttt{0010 1100}\) | \(\texttt{0010 0000}\) | \(\texttt{0111 0111}\) | \(\texttt{0110 1111}\) | \(\texttt{0111 0010}\) | \(\texttt{0110 1100}\) | \(\texttt{0110 0100}\) | \(\texttt{0010 0001}\) |
表 \(2\) —— Hello, world! 對(duì)應(yīng)的 ASCII 碼及二進(jìn)制
但是我們要讀取輸出的字符不僅僅只是英文那么簡(jiǎn)單啊,我們還要讀取輸出中文(如:你好,世界!)、日文(如:こんにちは、世界!)、emoji(如:??)等等,光是中文漢字都有 \(10,000\) 多個(gè),這遠(yuǎn)遠(yuǎn)超出了 ASCII 能讀取輸出的范圍。于是,人們又弄出了一套 Unicode 編碼,這個(gè)編碼幾乎覆蓋了全世界的語(yǔ)言的所有字符(包括中文、日文、韓文、阿拉伯文、西里爾文等),以及大量符號(hào)(如數(shù)學(xué)符號(hào)、 emoji 等)。這個(gè)編碼有常見(jiàn)的 \(3\) 種方案:UTF-8、UTF-16 以及 UTF-32。
如果我要存儲(chǔ) 漢あ?? 三個(gè)字符,先映射到 Unicode 編碼碼點(diǎn)中,然后查找二進(jìn)制。想要讀取輸出就進(jìn)行一次逆操作:先讀取二進(jìn)制,轉(zhuǎn)換為 Unicode 編碼,再查找是哪個(gè)字符映射過(guò)來(lái)的。這里以 UTF-8 為例子。
| 字符 | 漢 |
あ |
?? |
|---|---|---|---|
| Unicode 碼點(diǎn) | \(27721\) | \(12354\) | \(128522\) |
| 二進(jìn)制 | \(\texttt{11100110 10110001 10001001}\) | \(\texttt{11100011 10000010 10000010}\) | \(\texttt{11110000 10011111 10011000 10001010}\) |
表 \(3\) —— 漢あ?? 對(duì)應(yīng)的 Unicode 碼點(diǎn)及二進(jìn)制
圖片的存儲(chǔ)和讀取輸出
我們使用電腦時(shí)碰見(jiàn)圖片應(yīng)該也是常見(jiàn)的(上文的 ASCII 碼表就是一張圖片)。那么,圖片又是如何在計(jì)算機(jī)中存儲(chǔ)和讀取輸出的呢?
我們都知道,一張圖片是由很多很多像素點(diǎn)組成的。每一個(gè)像素點(diǎn)都有一個(gè) RGB(紅、綠、藍(lán),Red, Green, Blue)值。我們就拿一個(gè)表存下這個(gè)圖片所有像素點(diǎn)的 R 值、G 值、B 值,再轉(zhuǎn)換為二進(jìn)制存儲(chǔ)。當(dāng)然,如果這個(gè)圖片有透明度,根據(jù)不同的圖片格式,如果這個(gè)圖片是 PNG 格式,需要增加一個(gè)字節(jié)來(lái)讀取輸出透明度,\(0\) 讀取輸出全透明,\(255\) 讀取輸出不透明,這個(gè)透明度的值越小,越透明,反之亦然;如果這個(gè)圖片是個(gè) GIF 格式,只需要增加一位,\(0\) 讀取輸出透明,\(1\) 讀取輸出不透明。JPEG 和 BMP 格式的圖片無(wú)法渲染透明度。讀取輸出時(shí),根據(jù)每一個(gè) RGB 值和透明度值渲染每一個(gè)像素,再拼湊出這個(gè)圖案。
當(dāng)然,除了靜態(tài)圖,還有動(dòng)態(tài)圖。動(dòng)態(tài)圖就是記錄每一幀的圖片數(shù)據(jù),然后記錄每一幀的時(shí)長(zhǎng)、整體循環(huán)次數(shù),以及記錄一些幀間規(guī)則。記錄的這些東西都是一個(gè)一個(gè)的數(shù),可以直接轉(zhuǎn)換為二進(jìn)制存儲(chǔ)。讀取輸出時(shí),通過(guò)讀取記錄的每一個(gè)數(shù)據(jù),把每一幀于每一幀之間通過(guò)幀間時(shí)長(zhǎng)和一些其他的規(guī)則,把動(dòng)態(tài)的畫面展示出來(lái)。
聲音的存儲(chǔ)和讀取輸出
我們聽(tīng)歌的時(shí)候就會(huì)碰到聲音。那么計(jì)算機(jī)又是怎么存儲(chǔ)聲音的呢?其實(shí)本質(zhì)就是把模擬聲音信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)并以二進(jìn)制形式存儲(chǔ),核心步驟包括 “模擬信號(hào)數(shù)字化” 和 “數(shù)字?jǐn)?shù)據(jù)的編碼與存儲(chǔ)”。
模擬聲音信號(hào)的數(shù)字化
自然界的聲音(如人聲、樂(lè)器聲)是連續(xù)的模擬信號(hào)(隨時(shí)間連續(xù)變化的聲波),而計(jì)算機(jī)只能處理離散的數(shù)字信號(hào)(\(0\) 和 \(1\)),因此需要通過(guò) “模數(shù)轉(zhuǎn)換(ADC)” 將模擬聲音轉(zhuǎn)為數(shù)字形式,包含三個(gè)核心步驟:
- 采樣:按固定時(shí)間間隔截取模擬聲波的瞬時(shí)振幅,將連續(xù)的聲波 “離散化” 為一系列采樣點(diǎn)。采樣頻率(單位:Hz)越高,越接近原始聲音細(xì)節(jié)。
- 量化:將每個(gè)采樣點(diǎn)的振幅(模擬量)轉(zhuǎn)換為有限個(gè)離散的數(shù)字值(整數(shù)),確定每個(gè)采樣點(diǎn)的 “音量大小”。因離散化導(dǎo)致的原始信號(hào)與數(shù)字信號(hào)的差異,位數(shù)越高,誤差越小,聲音越細(xì)膩。
- 編碼:將量化后的整數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)(\(0\) 和 \(1\)),并添加同步信息、糾錯(cuò)碼等,形成可存儲(chǔ)的數(shù)字音頻流。
讀取輸出聲音
要從二進(jìn)制轉(zhuǎn)回聲音,卻不是向字符映射那么簡(jiǎn)單做個(gè)逆運(yùn)算就行的。首先需要讀取存儲(chǔ)的數(shù)據(jù),明確采樣率、量化數(shù)以及聲道數(shù)等方便后續(xù)處理。接著,借助數(shù)字模擬轉(zhuǎn)換器(DAC)把解碼后的 PCM 二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為模擬電壓或電流信號(hào)。DAC 的工作原理是將二進(jìn)制數(shù)字量譯碼后,把每一位依權(quán)值大小轉(zhuǎn)換為對(duì)應(yīng)的模擬量,再匯總這些模擬量得到最終模擬輸出信號(hào)。例如 R-2R 梯形電阻網(wǎng)絡(luò) DAC 可按 \(2\) 的冪次方比例將各二進(jìn)制位轉(zhuǎn)成對(duì)應(yīng)電流,求和后輸出匹配的模擬值。經(jīng) DAC 轉(zhuǎn)換的模擬信號(hào)常帶有高頻噪聲及混疊產(chǎn)物,需利用低通濾波器消除高于音頻頻段的信號(hào)成分。濾波器依據(jù)奈奎斯特采樣定理設(shè)置截止頻率,像針對(duì) \(44.1\) kHz 采樣的音頻,濾波器可將 \(22.05\) kHz 以上的高頻成分濾除,使輸出的模擬信號(hào)更平滑,接近原始模擬聲音信號(hào)。濾波后的模擬音頻信號(hào)通常強(qiáng)度較弱,要通過(guò)音頻放大器增強(qiáng)其功率,達(dá)到能驅(qū)動(dòng)揚(yáng)聲器或耳機(jī)等發(fā)聲設(shè)備的水平。最后,揚(yáng)聲器或耳機(jī)依據(jù)模擬信號(hào)的電壓或電流變化振動(dòng)發(fā)聲,讓人們聽(tīng)到對(duì)應(yīng)的聲音。
視頻的存儲(chǔ)和讀取輸出
視頻,其實(shí)就是動(dòng)圖和聲音的結(jié)合體。其主要就是對(duì)動(dòng)圖和聲音進(jìn)行一個(gè)封裝,同步時(shí)間戳,然后轉(zhuǎn)換為二進(jìn)制文件。對(duì)于如何存儲(chǔ)動(dòng)圖和聲音,請(qǐng)見(jiàn)上文。
讀取輸出視頻,首先就是讀取二進(jìn)制并解析封裝格式、編碼類型、時(shí)間戳規(guī)則等,然后分離視頻流和音頻流。接著,對(duì)視頻流和音頻流解碼(具體內(nèi)容請(qǐng)見(jiàn)上文),接著,音畫同步輸出。
尾聲
以上就是這篇文章的全部了,感謝各位讀者的閱讀。由于作者知識(shí)有限,有哪些地方寫得不好或者有錯(cuò)誤的,歡迎大家評(píng)論區(qū)指出。
本文來(lái)自博客園,作者:longyitongxue,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/Lytx-Luogu1145420/p/19043270/how_computer_binary

浙公網(wǎng)安備 33010602011771號(hào)