CPU 只能進行數值運算,那麼計算機是怎麼顯示出字元的?

和編譯器有關嗎?原理是怎樣的?
我是新人,剛開始學習計算機,現在在看計算機的程序構造與解釋,請大牛們指點迷津!


嚴格的來說,計算機就是是無法顯示出字元的……。


顯示字元的是計算機的外設產品如顯示器、投影儀、終端等等……


現代計算機顯示內容的方式通常是將要顯示的圖像數據存放在指定的內存區域(顯存),再由視頻輸出設備(顯卡)按照某些格式(VGA、DVI等)將圖像編碼傳輸給視覺呈現設備(顯示器、投影儀等),顯示器解碼並通過相應的硬體(陰極射線管、液晶等)還原成人類視覺可以讀取的圖像信息。

顯示字元和列印文檔本質上是一回事兒,純粹的計算機既不能顯示字元也不能列印文檔,這些都需要外部設備的支持。


大概是這個過程:

內存里的字元 → 內存里的 unicode → 字體文件中的 gid 序列 → 字體文件中的矢量圖序列 → 點陣化送顯示屏


?電梯樓層,餐廳的led顯示屏原理相似

?玩一下Minecraft紅石,做一個簡單的顯示屏有助於理解,


我很好奇為什麼有一個回答被刪了,但是那個回答真的非常簡潔明了得解釋了點陣圖

為了方便起見我假定顯示器是黑白單色的,用電子管打到屏幕上

一般來說,偏轉磁場會逐行z字掃描,當電子管打出電子時,屏幕上相應位置顯示白點,當電子管不打出電子,屏幕相應位置是黑色的。當然我們假設每次打出電子數量足夠多使得屏幕足夠亮,這樣就使得屏幕是嚴格意義上的「黑白」的,而不會產生灰度。提高拒斥電場會減少電子數量從而降低屏幕整體亮度。

差不多就是老式黑白電視的原理了,如果你用過模擬示波器的話,原理也是類似的。只不過示波器使用電場做偏轉,電視使用磁場做偏轉。

對於一個簡單的「顯示適配器」,當掃描開始時,顯示適配器逐個讀出「顯存」中的位,並把電壓相應得加到發射電場上。這樣就完成了顯示過程

我們假設屏幕是8*8的,一位元組是8位,那麼顯存是8位元組的,第一位元組第一位是屏幕左上角,第二位元組是屏幕的(1,0)位置,同理對應(2,0), (3,0), (4,0),…, (7,0),也就是說,右上角
之後的,(0,1),……, (7,1),;(0,2),(1,2),…, (7,2);……;(0,7),…, (7,7)

如果我們把顯示做到640*480呢,那麼恭喜你,你已經實現了一個「graphics adaptor」的雛形

我們可不可以引入彩色呢,我們可以在屏幕上的每一個像素位置做出非常接近的紅綠藍三個點,並讓偏轉磁場能夠精確得定位到三個點。對應於這三個點,我們在顯存上引入3個位面。當然,如果偏轉磁場沒有這個能力,我們可以使用三個非常靠近的電子槍,分別對應屏幕上的三種顏色。

大約30年前,某著名公司在實現中使用了紅,綠,藍,白4個位面,並加入了一些硬體來幫助軟體快速得操作顯存,並創造了一個著名的標準:VGA

當然電子管顯示器後來又存活了很長時間,並見證了更高解析度和更鮮艷的色彩,但是顯存作為CPU和GPU通信最重要的中繼者僅僅經過了一些微小的變化了。


你渴望更多細節么?那就看看樓下關森陌的答案吧

//以下借鑒自某個被刪除的答案:論點陣圖的原理
0000000001111111111111111110000000000
0000000011000000110000000110000000000
0000000011111111111111111110000000000
0000000011000000110000000110000000000
0000000111111111111111111110000000000
0000001100000000110000000110000000000
0000110000000000110000110110000000000
0011000000000000110000001110000000000
0000000000000000000000000000000000000
0000000000001111111110000000000000000
0000000001111000000011110000000000000
0000000111100000000000111100000000000
0000001111000000000000011110000000000
0000001111000000000000011110000000000
0000001111000000000000011110000000000
0000000111100000000000111100000000000
0000000001111000000011110000000000000
0000000000001111111110000000000000000
0000000000000000000000000000000000000
0000000000111100000000000000000000000
0000000011110000000000000000000000000
0000111101100000000001111111111100000
0000000001100000000001100000001100000
0001111111111111100001100000001100000
0000000111111100000001111111111100000
0001111001100110000000000000000000000
1110000001100010000000000000000000000
0000000000000000000000000000000000000
0000000111111111111111111111100000000
0000000000000000000000000000000000000


第一次回答問題。

顯示字元的方式在@Eagle和@雲天明的答案已經說的很好了,我這裡就做個搬運工吧。
盜一張比較容易理解的圖過來,關於VGA顯示控制的電路。

原圖來自科創論圖的「神之覺醒」。
如果有侵權的地方,請聯繫我,我會第一時間刪除侵權內容。


cpu計算的數值送達視圖處理程序轉換為二維形式的位元組碼的圖片數據而且存放在顯示緩衝區,顯示器以一定的頻率去獲取緩衝區數據,並且交給硬體驅動器,硬體驅動器轉換為控制信號去控制每個像素單元,從而產生人直接看到的模擬信號,這就是顯示的原理,而且顯示字元和其他也是如此。


看完我下面貼的3個視頻,基本可以明白其中的工作原理:

視頻1:(需要提醒的是,英文字元的A、B、C與1、2、3這些字元的顯示原理在本質上並沒有區別。一句話總結: 實際上是用led燈拼湊出字母的形狀,然後開啟拼湊形狀的led燈,熄滅非拼湊形狀的led燈 )

英文字元顯示原理(自製一個8比特10進位顯示裝置)-百家號

視頻2:

液晶顯示器工作原理 - 知乎專欄

思考提示:我們看到的顏色到底來自於哪裡?

視頻3:

最好的學習計算機工作原理的方法 - 知乎專欄

提示:第3個視頻主要是用於觀看用led燈拼湊不同的字母與方塊。

最後,歡迎關注我的百家號(晴耕雨讀)或微信公眾號(開心小黃人)。


CPU只能進行數值運算,但你看到的字元是顯示器給你顯示出來的。


CPU將圖像數據(數字形式)傳遞給顯示器,然後顯示器根據收到的數據(數字形式)決定屏幕上各個「像素」顯示什麼顏色,從而「顯示」出了字元、圖像。(湊近了看屏幕是可以看到一個個「小正方形」的,那些就是「像素」)


打個比方,CPU將1011011010000110101……的數據傳給顯示器,顯示器按照規定,每8位數字作為一個單位,表示一個像素的顏色,順序是先從左到右再從上到下,那麼10110110就代表最左上角像素應該顯示的顏色,假設10110110表示褐色,那顯示器就會令最左上角的像素顯示為褐色。

像素與字元的示意圖


一般來說電腦里都會有這樣一張ASCII碼錶,它是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語。也就是說每一個字元在計算機中都會由一個數字來代替,在現實的時候根據數據類型來決定是顯示成數字還是字元。ASCII現在逐漸被Unicode取代。


計算機不靠CPU「顯示」字元。

「顯示字元」是一個數模轉換過程,需要要能進行數模轉換的部件。


cpu不能顯示字元,計算機不只能數值運算,


樓上回答的都很詳細很正確,對一個新人不知道能不能理解。
我來用最笨的語言來談下下我的理解,然後題主還需要自己下功夫。

首先我們來記住一條規矩:計算機里的所有東西都遵循人的定義,也就是說人定了規矩,計算機執行。接著我們來看看這個問題吧:
cpu確實只負責邏輯運算,也就是加法,甚至連減法都不會(加法模擬出減法)。而計算機顯示,也就是計算機輸出和cpu無關,cpu提供一組數據給輸出端(可以理解為顯示屏),然後之前我們說過的原則就發揮作用了。
顯示屏根據人的定義,解析這組數據,比如字對應哪個字體文件,在哪個位置顯示,用什麼顏色顯示,顯示多少寬度等等。

接下來我們來理解下,顯示屏如何認識圖像。顯示屏是由一個個正方形點(像素)組成,這些點就會顯示一種顏色(也就是計算機顯示器設置中看到的16位色或24位色),而當點小到人眼無法識別的時候,我們視覺上就覺察不出這些點的縫隙。因此我們看到的畫面也是連貫的。團里如上,而對於硬體的實現,我也不懂,可以深究。

我想題主最關係的顯示器是怎麼一筆一畫寫出字來的。其實他沒有一筆一畫寫,而是根據字體文件中字的像素的分布規則顯示在顯示屏上而已,所以系統中我們會預裝很多字體文件(ttf後綴的文件)。換句話說,這些字體文件定義了一個字拆到像素上是怎麼顯示的。

總結:
cpu提供字數據=&>系統提供字體文件=&>顯示器顯示


CPU 只能進行數值運算,那麼計算機是怎麼顯示出字元的?

和編譯器有關嗎?原理是怎樣的?

我想我有必要公布一下正確答案。
題主的問題可以從兩個方向進行解讀:

  1. 數字與字元是如何進行對應或轉換的?
  2. CPU處理的、內存里存放的這些字元是如何被呈現在顯示器上的?

我分別作答。
----------------------------------------------

一、數字與字元是如何進行對應或轉換的?

答案是通過字元編碼,從早期的ASCII碼,到後來的Unicode碼,或者例如GBK的其它編碼,我們都是使用某個(組)唯一的數字來表示某個對應的字元。ASCII的定義如圖(圖片來自搜狗百科):

CPU在處理這些字元的時候,跟處理普通數字相比較,除了數據的位長以外,毫無區別。我們可以嘗試以下代碼:

//C/C++
#include &
int main()
{
printf("%d","a")
return 0;
}

我們會在屏幕上看到字元"a"對應的ASCII碼97,事實上很多語言的編譯器完全允許我們將字元型變數當作數字去使用,儘管我們不建議這樣做。

二、CPU處理的、內存里存放的這些字元是如何被呈現在顯示器上的?

為了使基本原理易於理解,我只會講最常見和簡單的情況:x86架構、只使用集成顯卡、VGA。更複雜的情況也差不多是同樣的原理。
首先我們得知道,顯示器會使用一根線連在我們的電腦主機上,那麼那個藍色的VGA介面對應的部件是什麼呢?是顯卡。也就是說顯示器上的所有內容都被顯卡直接控制。每一塊顯卡都擁有一塊對應的顯存,顯卡BIOS程序以每秒60幀左右的速率不間斷將顯存里的內容,參照VGA標準轉換成對應的電信號傳輸到顯示器上,逐個改變顯示器上的每一個像素狀態
通常情況下顯卡擁有兩大類顯示模式。其一是字元模式:顯存里線性存放著ASCII碼以及對應的顯示配置,顯卡BIOS將ASCII碼按照各自對應的字元圖形,轉換成像素陣列,再轉換成電信號傳輸到顯示器;其二是圖形模式:顯存里直接存放著像素矩陣,顯卡BIOS直接將每個像素轉換成電信號傳輸到圖形模式。DOS系統,字元模式的Linux、Unix、以及以前常見的開機自檢,使用的都是字元模式,而字元模式使用的ASCII不包含中文,導致了它們都不支持中文顯示;所有圖形顯示(包括您現在收看的知乎)使用或間接使用的都是圖形模式,在圖形模式中顯示文字依靠的是字體庫,裡面記錄著每個字元的柵格圖或者矢量圖(我們可以在控制面板外觀和個性化字體這個位置觀看到字體庫),操作系統依其將每個字元繪製在相應的顯存位置。
現在我們明白了顯卡如何將字元顯示到顯示器上,那麼CPU里的數值是如何跑到顯存里去的呢?答案很簡單,寫顯存啊!在x86架構中,集成顯卡的顯存直接從內存中分配(知道為啥你的可用內存總比安裝內存小了吧!),也就是說,操作顯存的實質就是操作某一段被預分配的內存,CPU操作內存,不難理解對吧:)。

如果有客官想了解關於顯卡工作的更多細節,歡迎移步 @雲天明 的回答。


我用土話告訴你吧,cpu只認識二進位並能進行計算,而二進位數代表的含義是操作系統附給它的
。例如cpu知道1+1=2,2在內存中就只是個數:0000 0011,而這個數代表什麼,cpu不知道,操作系統可以讓它代表2,也可以代表一個字元或一個點,這都是操作系統規定的。而操作系統是人來寫的,所以最終還是人規定的。

輸入輸出其實都是操作系統提供的功能,都是通過系統介面(對應的庫函數、I/O庫什麼的)提供的。簡單說當你用C語言寫printf("%c",50);時,編譯連接後生成的可執行程序中就調用了操作系統中的輸出介面。50是顯示成字元2,還是顯示成50呢?%c就告訴操作系統的輸出介面:按字元輸出,然後屏幕上就顯示出了2。如果你用java語言寫,println(50);沒告訴50按什麼顯示,但顯示的是50,如果你想顯示2,需要println("2");表面上並沒有明確告訴應該怎麼顯示,但這是語言規定的。當這個java程序執行時,也是調用操作系統的輸出介面,然後告訴它按數字顯示(雖然你沒有表面上告訴怎麼顯示,但java內部偷偷告訴了)。
所以還引出為什麼windows和linux都是原生支持C語言,但在windows平台上編寫編譯的程序在linux上運行不了,因為在編譯時調用了不同的操作系統底層的東西。這些調用都是編譯器幫你做的。

操作系統是協調各種硬體工作的,它把硬體的功能都封裝在介面中,說白了就是如果你想讓電腦出聲音,調用系統提供的出聲音方法,把參數傳進去就行了;你想讓電腦顯示畫面,高用系統提供的顯示畫面的方法,把參數傳進去就行了。

你把滑鼠插入電腦,操作系統檢測到後就會識別,然後載入驅動,然後滑鼠就正常工作了。也是一樣的原理:
USB介面是一個通用協議,這個協議規定了在設備的某個位置存儲著什麼樣的信息。操作系統通過讀取這個位置的信息就知道這是一個什麼設備了,但設備在這時還不能工作,因為操作系統根本不明白設備傳回來的數據是什麼意思,所以需要載入驅動,驅動就是用來解釋這些數據是什麼意思的程序。像滑鼠、手機這種設備比較大眾,系統中一般都有通用驅動,所以也不用你自己安裝驅動,插上就可以使用了,但如果是專業設備,比較說usb溫度記錄器或者按鍵特別多的滑鼠,都是需要自己裝上驅動,硬體才可以正常工作。

我說了這麼多,你明白了吧


我用比較通俗的話說一說,大神請諒解。
-------
為了方便理解,需要進行大量的簡化。我會從最簡單的開始解釋,
先說說顯示端
下圖叫做7段數碼管,因為他有七段。。。。

如果我想顯示大寫英語字母A,我讓a.b.c.e.f.g發亮就可以。

對應的就是1.2.4.7.9.8號管腳(電線)。就這樣顯示出了字元。
但這樣做會有問題,你想想看,為了顯示一個英語字元,我居然需要控制7個輸出,如果我想顯示一個中文,怎麼辦。如果屏幕要顯示一段作文,那工程師還不得接幾百萬條線氣死。

於是出現了解碼器,一批能人異士制定了相關規則和標準,然後他們說以後誰用數碼管顯示,可以用我們家的解碼器,這樣干既輕鬆,效率也高。之後那批能人異士開始悄悄地賣解碼器賺錢(??`ω′?)。
解碼器能通過內部設計好的電路,減少數碼管顯示所需要控制的管腳數量,一句話:本來要連7個電線,現在用了我們家的解碼器,你只需要連4根電線。

這是比較簡單的解碼器。通過抽象思維,我們可以想像有一個高級傳說稀有鈦合金級別的解碼器,只需要告訴他15個1或0,他就可以控制一個「三百萬段數碼管」。這就是VGA。
(VGA還使用了時鐘的概念,這裡不好展開)

CPU端
我感覺很多人會想到CPU只有一個輸出的電線
正確的想法是:CPU可以同時有多個輸入輸出,又可以不同時(時鐘)有多個輸入輸出。

來看看CPU晶元的輸入輸出可以有幾個

密密麻麻的,哇 強迫症表示橫排第五根比其他的還要粗點,難受。

總結來說就是
CPU可以通過密密麻麻的電線連接到解碼器。然後解碼器又連接屏幕上密密麻麻的素點進行控制。人類只要設計好字元對應的點陣,並設計出解碼器,計算機就可以點亮與字元對應的像素點,完成顯示字元的任務。

我的筆記本屏幕解析度是1366x768,也就是說我的屏幕上有1366x768個像素點。一百萬個左右,有三種顏色,所以有三百萬個左右的像素點。於是我電腦里的邪惡的CPU 通過超級傳說稀有鈦合金級解碼器殘暴的奴役了三百萬個無辜的 led燈。而我卻高高在上 ,在知乎刷贊。
咦, 贊呢??( ???????? )


一生二,二生三,三生萬物。
最簡單的開開關關,經過上億次的組合,於是就變成各種高科技了。
圍棋也是,DNA也是,一開始的規則都很簡單,多了就複雜了。


CPU確實只能進行數值運算。

但是你可以這樣想:顯示是由像素點構成的,每一個像素點的顏色是可以被控制的。於是,我可以先把字元的顯示方式存儲起來。像這樣:

你可以看到,在一個字元的區域大小內,把該點亮的像素和不該點亮的像素記錄下來。並和這個字的編碼進行對應。

當要顯示出一個「中」字的時候,首先找到這個字對應的編碼,通過編碼找到這個字的亮滅數據(字型檔)找出來。然後控制顯示器上的某個區域按照這個字存儲的對應的亮滅去控制這個區域內的像素。這個字就顯示出來了


我有必要站在現代計算機的角度給你科普一下,同時也講一下利用原始的方法操控屏幕的方法。

試想,我們現在利用拼音輸入法在計算機屏幕上打字,你敲擊鍵盤,輸入拼音,計算機對這一行為的解析過程大概是這樣的:輸入碼——〉機內碼
—— 〉字型碼,每一層都包含了很多抽象,你要理解的是計算機識別一個漢字(或者任何一個字元)都是逐步編碼和解碼,轉化而二進位信息,進而利用高低電平和基本的電子元器件顯示出來文字效果。

事實上,操作系統和應用程序在實際的解讀過程中扮演了重要的角色,除此之外,圖形適配器和顯存也很關鍵,這些計算機的硬體設備一般來講不需要我們直接操作,我前面提到的原始方法就是你可以直接寫顯存顯示字元串,這非常麻煩,且代碼量巨大,估計顯示一條直線,就要上千行代碼,因為你是用彙編語言直接操作。

當然,計算機里的數值和字元,都是用高和低兩種不同的電壓,人為定義出來的。兩種電壓正好可以對應1和0,用二進位表示。CPU的本質是利用指令來進行適當的電平轉換,不管是液晶顯示器還是CRT,最終圖像適配器還是利用字型碼在點亮屏幕。

當然對於複雜的圖形,處理起來難度很大,因此引入了GPU。


問題的前提就錯了。
CPU能幹的,說穿了只有一件事:轉換電壓。

是的,冷艷高貴的CPU本質上和8元包郵的「萬能手機充電器」是一樣一樣的。
沒辦法,三極體就只會幹這行。
當然,CPU包含的三極體很多很複雜。《組成原理》這門課有講一點點。
===========================

回答題主的問題。
電腦里的數值和字元,都是用高和低兩種不同的電壓,人為定義出來的。兩種電壓正好可以對應10,用二進位表示。
怎麼定義,也是學問,而且是兩門學問。

所以,CPU壓根兒分不出來數值和字元。


計算器見過吧 處理器只告訴顯示器這個像素點安放在哪 它才不知道什麼叫字元


推薦閱讀:

PHP程序員:你用的是什麼代碼編輯器?為什麼?
為什麼我時不時會看到「珍惜生命,遠離 C++」?
我學編程為什麼難?是思維方式不對還是學習方式不對?
Meta Programming 主要解決什麼了問題?
有哪些老程序員都知道對新手很有用的經驗?

TAG:編程 | 計算機系統 | 計算機科學 | 計算機組成原理 |