編程的碼
㈠ 電腦的編程碼
(1)機器語言與匯編語言
計算機中CPU 的功能很強,但它只認識由二進制數字構成的機器碼指令(機器語言),可以直接執行。例如,某條簡單的機器碼加法指令為0000010001111100B。人工對這種指令很難看出它的含義。若由人工編寫程序,其過程無疑極其煩瑣,且難於理解、編制和調試。因而只有在早期的計算機中才用過機器碼指令。如果將上述指令寫成「ADD AL,7CH」,專業人員即可看出是將A寄存器中低八位的數據和十六進制數7CH相加,並且將結果仍存放於A寄存器的低八位中。這種指令和機器碼指令一一對應,但意義明顯多了。因而對程序的理解、編制和調試要方便多了。這種以字元形式代替機器碼的指令稱為匯編指令,其指令集合稱為匯編語言。為了加強匯編語言的能力,加入了一些不是機器碼指令的語句,這種匯編語言稱為宏匯編語言。雖然使用宏匯編語言比使用機器碼方便多了,但是利用匯編語言進行編程依然是非常辛苦的。
由匯編語言寫成的程序是一個文本文件(由ASCII 表示,人是可以看懂的),稱為匯編語言源程序。CPU不認識這種程序(它只認機器碼指令),所以執行之前要先由計算機將其轉化為由機器碼指令構成的目的程序,這個過程叫匯編。由機器碼指令轉化為匯編語言程序的過程叫反匯編。匯編語言要將程序中的每一步CPU的動作指明,仍極煩瑣。但由匯編語言編制的程序運行效率高,故在專業人員中仍得到廣泛的應用。如果說機器碼指令是第一代計算機語言,匯編語言則是第二代語言。
(2)高級語言與編譯系統
為了提高編製程序的效率,也為了使一般用戶能夠掌握編製程序的能力,計算機語言發展了第三代語言,即高級語言。高級語言的表達方式近似於自然語言,易於理解和檢查。有了高級語言,一般用戶才開始進入了計算機的應用領域。使用高級語言編制的源程序依然是文本文件,計算機仍然不能直接執行,也要轉化為機器碼指令的目的程序才能執行。
轉化的方法有解釋和編譯兩種。
解釋的方法是對源程序中的每一句命令都先把它翻譯成為可以執行的用二進制數表示的目的代碼予以執行,執行完畢後再解釋、執行下一句。這樣的好處是對於調試程序非常方便,哪一句出了問題就可以直接地顯示和修改。缺點是速度太慢。就像我們以零售方式去買大量的貨物一樣不合適。
編譯的方法是首先對源程序從頭到尾進行掃描,找出所有可以識別出來的語法錯誤和一些邏輯錯誤,並要求用戶對源程序再次編輯改正,直到再次編譯時不再發現錯誤。編譯程序對源程序再次掃描進行優化後,得出由機器碼指令構成的工作文件,此時編譯過程完畢。由於高級語言將不少功能作為函數提供給用戶使用,而用戶程序中僅僅給出了函數名並沒有完成函數功能的程序。所以要從編譯系統提供的庫文件中找出相應的函數程序和工作文件,合成為可以執行的目的程序。這個過程叫做鏈接。所以,一個高級語言源程序的執行要經過編輯、編譯、鏈接、執行等幾個過程。由於一些軟體公司提供了集成化環境(如Turbo C,Turbo Pascal),用戶不必自己直接一步一步地執行這些過程,而是由集成化環境軟體代替人工執行了,但是實際工作並沒有消失。
軟體系統中,提供編輯源程序功能的編輯程序、解釋功能的程序、編譯功能的程序和鏈接的程序組成編譯系統。
為了方便用戶編輯文本文件(包括源程序或稱源文件及各種文書文件),系統軟體提供了多種編輯工具。如早期的行編輯(EDLIN.COM)及以後的全屏幕編輯(EDIT.COM,WORDSTAR等)。為方便中文的編輯,我國的計算機工作者開發了CCED,WPS 等編輯軟體。解釋和編譯程序並不通用,不同的高級語言各自具有不同的編譯程序。近來為方便用戶,計算機軟體生產廠家提供了一體化的編譯環境,將各個有關功能都集成於一體,為程序的編輯、運行、調試提供了方便。
(3)常用的高級語言和第四代語言
常用的高級語言
① FORTRAN:第一個高級語言是FORTRAN 語言,它是公式翻譯的意思(Formula Translation中的For 和Tran的組合),目的是用於科學計算。其特點是數學函數豐富、計算速度快,目前新的版本努力彌補其在字元和圖形處理方面的不足。它經歷了FORTRANII,FORTRANIV,FORTRAN77,FORTRAN5等重要的發展階段,曾幾次列為美國國家標准。其影響力至今不衰。
② BASIC:BASIc語言由FORTRAN 語言脫胎而來,意義是初學者通用指令代碼(Beginner』s All-purpose Symbolic Instruction Code)。它原意是為初學FORTRAN的人提供入門的訓練。它易學易用,適於初學者學習使用,因而受到廣泛的歡迎。正因如此,各個廠家開發了約幾百種版本,影響廣泛,但也互不統一,使得交流移植不便。一個相當長的時期內,有的人認為BASIC 將被淘汰。事實上,BASIC 不僅沒有滅絕,而且有長足的發展,顯示了強大的生命力。在IBM PC機的隨機DOS 系統盤中都提供了BASIC 的軟體。早期提供的是BASIC 和BASICA。它們都是解釋型的高級語言,運行速度慢,且沒有集成環境的支持。現在提供的是Visual BASIC,既可解釋執行,也可以編譯執行,功能很強,適合於各種用戶的要求。
③ Pascal:Pascal語言是由ALGOL 60發展而來的一種結構化的高級語言。其結構嚴謹、數據類型豐富,深得專業計算機工作者的重視,曾經成為計算機教育的標准語言。現在發展為Delphi語言,功能同樣很強,也適合於各種應用。
④ COBOL:通用商用語言(common business-oriented language)。這是一種描述性很強的語言,非常適合於描述現實世界的數據結構。雖然它的運算能力並不強(可以滿足商業應用的需要),但程序的書寫和英語非常近似,會英語的人非常容易掌握。所以在美國近一半以上的用戶曾經使用的是COBOL 語言。美國現在運行的一些程序仍然是COBOL程序。
⑤ C:C 語言是一種高效、強有力的語言,既具有結構化高級語言的特點,又具有像匯編語言一樣的處理低級操作(直接指揮計算機的硬體系統)的功能。所以有人將它稱為中級語言。在專業計算機工作者之中曾經廣泛應用它編制各種應用程序和系統程序,如UNIX操作系統的內核就是用C語言重新寫過的。現在雖然發展成為C++、Visual C++、C#,其在教學中依然得到廣泛的應用。
Visual C++,Delphi,Visual BASIC 是目前應用最廣的、所謂「面向對象」的三門高級語言。
第四代語言
人們稱高級語言是第三代語言,其特點是面向過程。所謂面向過程,是指用戶在程序中不但要說明解決什麼問題,還要告訴計算機如何去解決,即詳細地告訴計算機解決問題的每一個步驟。有人稱此時的計算機是「勤快的笨蛋」。計算機技術的發展為適應用戶的要求,只需描述要解決的問題,這就要求計算機具有一定的智能。目前稱具有這種功能的語言為第四代語言(4GL)。但完全具有這種功能不是一件容易的事。一些稱為4GL 的編程語言只能在一個小范圍內使用。現實離人們對於第四代語言的期待還相差很遠。
㈡ C語言編程之二進制原碼、反碼和補碼
概述
在計算機內,有符號數有3種表示法:原碼、反碼和補碼。
在計算機中,數據是以補碼的形式存儲的,所以補碼在c語言的教學中有比較重要的地位,而講解補碼必須涉及到原碼、反碼。
詳細釋義
所謂原碼就是二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
原碼、反碼和補碼的表示方法
定點整數表示法
定點小數小時法
反碼
正數:正數的反碼與原碼相同。
負數:負數的反碼,符號位為「1」,數值部分按位取反。
例如: 符號位 數值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:
a. 數0的反碼也有兩種形式,即
[+0]反=00000000B
[- 0]反=11111111B
b. 8位二進制反碼的表示範圍:-127~+127
原碼
在數值前直接加一符號位的表示法。
例如: 符號位 數值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:
數0的原碼有兩種形式:
[+0]原= 00000000B
[-0]原= 10000000B
位二進制原碼的表示範圍:-127~+127
補碼
1)模的概念:把一個計量單位稱之為模或模數。
例如,時鍾是以12進制進行計數循環的,即以12為模。在時鍾上,時針加上(正撥)12的整數位或減去(反撥)12的整數位,時針的位置不變。
對於一個模數為12的循環系統來說,加2和減10的效果是一樣的;因此,在以12為模的系統中,凡是減10的運算都可以用加2來代替,這就把減法問題轉化成加法問題了(註:計算機的硬體結構中只有加法器,所以大部分的運算都必須最終轉換為加法)。
10和2對模12而言互為補數。
同理,計算機的運算部件與寄存器都有一定字長的限制(假設字長為8),因此它的運算也是一種模運算。當計數器計滿8位也就是256個數後會產生溢出,又從頭開始計數。產生溢出的量就是計數器的模,顯然,8位二進制數,它的模數為2^8=256。在計算中,兩個互補的數稱為「補碼」。
2)補碼的表示:
正數:正數的補碼和原碼相同。
負數:負數的補碼則是符號位為「1」。並且,這個「1」既是符號位,也是數值位。數值部分按位取反後再在末位(最低位)加1。也就是「反碼+1」。
例如: 符號位 數值位
[+7]補= 0 0000111 B
[-7]補= 1 1111001 B
補碼在微型機中是一種重要的編碼形式,請注意:
a. 採用補碼後,可以方便地將減法運算轉化成加法運算,運算過程得到簡化。
正數的補碼即是它所表示的數的真值,而負數的補碼的數值部份卻不是它所表示的數的真值。
採用補碼進行運算,所得結果仍為補碼。
b. 與原碼、反碼不同,數值0的補碼只有一個,即
[0]補=00000000B。
若字長為8位,則補碼所表示的范圍為-128~+127;進行補碼運算時,應注意所得結果不應超過補碼所能表示數的范圍。
原碼、反碼和補碼之間的轉換
由於正數的原碼、補碼、反碼表示方法均相同,不需轉換。
在此,僅以負數情況分析。
(1) 已知原碼,求補碼。
例:已知某數X的原碼為10110100B,試求X的補碼和反碼
解:由[X]原=10110100B知,X為負數。求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。
1 0 1 1 0 1 0 0 原碼
1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反
1 1 0 0 1 1 0 0 補碼,符號位不變,數值位取反+1
故:[X]補=11001100B,[X]反=11001011B。
(2) 已知補碼,求原碼。
分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1 有方法。
例:已知某數X的補碼11101110B,試求其原碼。
解:由[X]補=11101110B知,X為負數。
1 1 1 0 1 1 1 0 補碼
1 1 1 0 1 1 0 1 反碼(符號位不變,數值位取反加1)
1 0 0 1 0 0 1 0 原碼(符號位不變,數值位取反)
關於補碼的補充例子:
一個正的整數的補碼就是這個整數變成二進制的值。
舉例:一個int型變數i=10,其二進制補碼就是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A)
2. 一個負整數的二進制補碼,就是該負數的絕對值所對應的補碼全部取反後加1.
舉例:int i=-10的補碼如何求得:
先求-10的絕對值10的補碼是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A);
再將求得的補碼取反: 1111 1111 1111 1111 1111 1111 1111 0101
再將取反後得到的補碼加1: 1111 1111 1111 1111 1111 1111 1111 0101 + 1
即可得到-10的二進制補碼: 1111 1111 1111 1111 1111 1111 1111 0110(0xFFFFFFF6)
3. +0和-0的二進制補碼都是0
首先+0的二進制補碼是0;
-0的二進制補碼是+0的二進制補碼取反後加1,+0的二進制補碼為0,取反後為FFFFFFFF,加1後還是0
原碼和反碼在數值0都有二意,唯有補碼在數值0是唯一的碼值!