




已閱讀5頁,還剩147頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Easy搞定C語言(基礎(chǔ)篇)1. C語言概述1.1 什么是C語言一提到語言這個詞語,自然會想到的是像英語、漢語等這樣的自然語言,因為它是人和人交換信息不可缺少的工具。而今天計算機(jī)遍布了我們生活的每一個角落,除了人和人的相互交流之外,我們必須和計算機(jī)角落。用什么的什么樣的方式和計算機(jī)做最直接的交流呢?人們自然想到的是最古老也最方便的方式語言,而C語言就是人和計算機(jī)交流的一種語言。語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能:l 說的一方傳遞信息,聽的一方接收信息;l 說的一方下達(dá)指令,聽的一方遵循命令做事情。語言是人和人交流,C語言是人和機(jī)器交流。只是,人可以不聽另外一個人,但是,計算機(jī)是無條件服從。語言有獨特的語法規(guī)則和定義,雙方必須遵循這些規(guī)則和定義才能實現(xiàn)真正的交流。1.2 計算機(jī)介紹1.2.1 計算機(jī)結(jié)構(gòu)組成1.2.2 計算機(jī)系統(tǒng)組成1.2.3 程序和指令l 指令是對計算機(jī)進(jìn)行程序控制的最小單位。l 所有的指令的集合稱為計算機(jī)的指令系統(tǒng)。l 程序是為完成一項特定任務(wù)而用某種語言編寫的一組指令序列。1.3 語言發(fā)展歷程1.3.1 機(jī)器語言計算機(jī)的大腦或者說心臟就是CPU,它控制著整個計算機(jī)的運作。每種CPU,都有自己的指令系統(tǒng)。這個指令系統(tǒng),就是該CPU的機(jī)器語言。機(jī)器語言是一組由0和1系列組成的指令碼,這些指令碼,是CPU制作廠商規(guī)定出來的,然后發(fā)布出來,請程序員遵守。要讓計算機(jī)干活,就得用機(jī)器語言(二級制數(shù))去命令它。這樣的命令,不是一條兩條,而是上百條。而且不同型號的計算機(jī)其機(jī)器語言是不相通的,按著一種計算機(jī)的機(jī)器指令編制的程序,不能在另一種計算機(jī)上執(zhí)行。1.3.2 匯編語言和編譯器機(jī)器語言編程是不是很令人煩惱呢,終于出現(xiàn)了匯編語言,就是一些標(biāo)識符取代0與1。一門人類可以比較輕松認(rèn)識的編程語言。只是這門語言計算機(jī)并不認(rèn)識,所以人類還不能用這門語言命令計算機(jī)做事情。這正如如何才能讓中國人說的話美國人明白呢?翻譯!所以,有一類專門的程序,既認(rèn)識機(jī)器語言,又認(rèn)識匯編語言,也就是編譯器,將標(biāo)識符換成0與1,知道怎么把匯編語言翻譯成機(jī)器語言。1.3.3 高級語言匯編語言和機(jī)器語言都是面向機(jī)器的,機(jī)器不同,語言也不同。既然有辦法讓匯編語言翻譯成機(jī)器語言,難道就不能把其他更人性化的語言翻譯成機(jī)器語言?1954年,F(xiàn)ortran語言出現(xiàn)了,其后相繼出現(xiàn)了其他的類似語言。這批語言,使程序員擺脫了計算機(jī)硬件的限制,把主要精力放在了程序設(shè)計上,不在關(guān)注低層的計算機(jī)硬件。這類語言,稱為高級語言。同樣的,高級語言要被計算機(jī)執(zhí)行,也需要一個翻譯程序?qū)⑵浞g成機(jī)器語言,這就是編譯程序,簡稱編譯器。這類高級語言解決問題的方法是分析出解決問題所需要的步驟,把程序看作是數(shù)據(jù)被加工的過程?;谶@類方法的程序設(shè)計語言成為面向過程的語言。C語言就是這種面向過程的程序設(shè)計語言。1.3.4 語言的層次1.3.5 語言進(jìn)化史1.4 為什么要學(xué)習(xí)C語言1.4.1 C語言特點1) 優(yōu)點n 代碼量小n 執(zhí)行速度快n 功能強(qiáng)大n 編程自由2) 缺點n 寫代碼實現(xiàn)周期長n 可移植性較差n 過于自由,經(jīng)驗不足易出錯n 對平臺庫依賴較多1.4.2 學(xué)習(xí)C語言理由1.4.3 C語言應(yīng)用領(lǐng)域C語言的應(yīng)用極其廣泛,從網(wǎng)站后臺,到底層操作系統(tǒng),從多媒體應(yīng)用到大型網(wǎng)絡(luò)游戲,均可使用C語言來開發(fā):l C語言可以寫網(wǎng)站后臺程序l C語言可以專門針對某個主題寫出功能強(qiáng)大的程序庫l C語言可以寫出大型游戲的引擎l C語言可以寫出另一個語言來l C語言可以寫操作系統(tǒng)和驅(qū)動程序,并且只能用C語言編寫l 任何設(shè)備只要配置了微處理器,就都支持C語言。從微波爐到手機(jī),都是由C語言技術(shù)來推動的1.4.4 C語言的簡潔C語言僅有32個關(guān)鍵字,9種控制語句,34種運算符,卻能完成無數(shù)的功能:1.4.5 學(xué)習(xí)C語言的常見困惑1.5 第一個C語言程序:HelloWorld1.5.1 編寫C語言代碼:hello.c#include int main()/這是第一個C語言代碼printf(hello worldn);return 0;C語言的源代碼文件是一個普通的文本文件,但擴(kuò)展名必須是.c。1.5.2 通過gcc編譯C代碼1) gcc編譯器介紹編輯器(如vi、記事本)是指我用它來寫程序的(編輯代碼),而我們寫的代碼語句,電腦是不懂的,我們需要把它轉(zhuǎn)成電腦能懂的語句,編譯器就是這樣的轉(zhuǎn)化工具。就是說,我們用編輯器編寫程序,由編譯器編譯后才可以運行!編譯器是將易于編寫、閱讀和維護(hù)的高級計算機(jī)語言翻譯為計算機(jī)能解讀、運行的低級機(jī)器語言的程序。gcc(GNU Compiler Collection,GNU 編譯器套件),是由 GNU 開發(fā)的編程語言編譯器。gcc原本作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類Unix操作系統(tǒng)(如Linux、BSD、Mac OS X等)采納為標(biāo)準(zhǔn)的編譯器,gcc同樣適用于微軟的Windows。gcc最初用于編譯C語言,隨著項目的發(fā)展gcc已經(jīng)成為了能夠編譯C、C+、Java、Ada、fortran、Object C、Object C+、Go語言的編譯器大家族。編譯命令格式:gcc -option1 . g+ -option1 . l 命令、選項和源文件之間使用空格分隔l 一行命令中可以有零個、一個或多個選項l 文件名可以包含文件的絕對路徑,也可以使用相對路徑l 如果命令中不包含輸出可執(zhí)行文件的文件名,可執(zhí)行文件的文件名會自動生成一個默認(rèn)名,Linux平臺為a.out,Windows平臺為a.exegcc、g+編譯常用選項說明:選項 含義-o file指定生成的輸出文件名為file-E只進(jìn)行預(yù)處理-S(大寫)只進(jìn)行預(yù)處理和編譯-c(小寫)只進(jìn)行預(yù)處理、編譯和匯編2) Linux平臺下編譯代碼l gcc warning的意思是警告,是有問題,但不影響編譯l error是錯誤,如果遇到error,那么就不能編譯了3) Windows平臺下gcc環(huán)境配置windows命令行界面下,默認(rèn)是沒有g(shù)cc編譯器,我們需要配置一下環(huán)境。由于我們安裝了Qt,Qt是一個集成開發(fā)環(huán)境,內(nèi)部集成gcc編譯器,配置一下環(huán)境變量即可使用gcc。a) 進(jìn)入Qt安裝目錄:b) 拷貝gcc所在的路徑(不同安裝目錄有所差異)C:QtQt5.5.0Toolsmingw492_32binc) 設(shè)置windows環(huán)境變量計算機(jī)(右擊) 屬性:如果是win7,雙擊Path后,把拷貝的路徑追加到后面,路徑之間需要英文” ; ”分隔:如果是win10,界面做得友好一下,新建添加路徑即可:d)測試gcc命令:4) Windows平臺下編譯代碼5) 注意事項Linux編譯后的可執(zhí)行程序只能在Linux運行,Windows編譯后的程序只能在Windows下運行。64位的Linux編譯后的程序只能在64位Linux下運行,32位Linux編譯后的程序只能在32位的Linux運行。64位的Windows編譯后的程序只能在64位Windows下運行,32位Windows編譯后的程序可以在64位的Windows運行。1.5.3 代碼分析1) include頭文件包含l #include的意思是頭文件包含,#include 代表包含stdio.h這個頭文件l 使用C語言庫函數(shù)需要提前包含庫函數(shù)對應(yīng)的頭文件,如這里使用了printf()函數(shù),需要包含stdio.h頭文件l 可以通過man 3 printf查看printf所需的頭文件#include 與 #include 的區(qū)別:l 表示系統(tǒng)直接按系統(tǒng)指定的目錄檢索l 表示系統(tǒng)先在 指定的路徑(沒寫路徑代表當(dāng)前路徑)查找頭文件,如果找不到,再按系統(tǒng)指定的目錄檢索stdio.h是在操作系統(tǒng)的系統(tǒng)目錄下:2) main函數(shù)l 一個完整的C語言程序,是由一個、且只能有一個main()函數(shù)(又稱主函數(shù),必須有)和若干個其他函數(shù)結(jié)合而成(可選)。l main函數(shù)是C語言程序的入口,程序是從main函數(shù)開始執(zhí)行。3) 括號,程序體和代碼塊l 叫代碼塊,一個代碼塊內(nèi)部可以有一條或者多條語句l C語言每句可執(zhí)行代碼都是;分號結(jié)尾l 所有的#開頭的行,都代表預(yù)編譯指令,預(yù)編譯指令行結(jié)尾是沒有分號的l 所有的可執(zhí)行語句必須是在代碼塊里面4) 注釋l /叫行注釋,注釋的內(nèi)容編譯器是忽略的,注釋主要的作用是在代碼中加一些說明和解釋,這樣有利于代碼的閱讀l /*/叫塊注釋l 塊注釋是C語言標(biāo)準(zhǔn)的注釋方法l 行注釋是從C+語言借鑒過來的5) printf函數(shù)l printf是C語言庫函數(shù),功能是向標(biāo)準(zhǔn)輸出設(shè)備輸出一個字符串l printf(“hello worldn”);/n的意思是回車換行6) return語句l return代表函數(shù)執(zhí)行完畢,返回return代表函數(shù)的終止l 如果main定義的時候前面是int,那么return后面就需要寫一個整數(shù);如果main定義的時候前面是void,那么return后面什么也不需要寫l 在main函數(shù)中return 0代表程序執(zhí)行成功,return -1代表程序執(zhí)行失敗l int main()和void main()在C語言中是一樣的,但C+只接受int main這種定義方式1.6 system函數(shù)1.6.1 system函數(shù)的使用#include int system(const char *command);功能:在已經(jīng)運行的程序中執(zhí)行另外一個外部程序參數(shù):外部可執(zhí)行程序名字返回值:成功:不同系統(tǒng)返回值不一樣失敗:通常是 - 1示例代碼:#include #include int main()/system(calc); /windows平臺system(ls); /Linux平臺, 需要頭文件#include return 0;1.6.2 system返回值不同系統(tǒng)結(jié)果不一樣C語言所有的庫函數(shù)調(diào)用,只能保證語法是一致的,但不能保證執(zhí)行結(jié)果是一致的,同樣的庫函數(shù)在不同的操作系統(tǒng)下執(zhí)行結(jié)果可能是一樣的,也可能是不一樣的。在學(xué)習(xí)Linux發(fā)展史時,我們得知Linux的發(fā)展離不開POSIX標(biāo)準(zhǔn),只要符合這個標(biāo)準(zhǔn)的函數(shù),在不同的系統(tǒng)下執(zhí)行的結(jié)果就可以一致。Unix和linux很多庫函數(shù)都是支持POSIX的,但Windows支持的比較差。如果將Unix代碼移植到Linux一般代價很小,如果把Windows代碼移植到Unix或者Linux就比較麻煩。1.6.3 Qt圖形界面調(diào)用systemvoid Widget:on_pushButton_clicked() /system(calc); /需要頭文件:#include WinExec(calc, SW_NORMAL); /需要頭文件:#include void Widget:on_pushButton_2_clicked() system(notepad);void Widget:on_pushButton_3_clicked() system(mmc);1.6.4 MFC圖形界面調(diào)用systemvoid CvssystemDlg:OnBnClickedButton1()/ TODO: 在此添加控件通知處理程序代碼/WinExec(calc, SW_NORMAL); 需要頭文件:#include system(calc); /需要頭文件:#include void CvssystemDlg:OnBnClickedButton2()/ TODO: 在此添加控件通知處理程序代碼/WinExec(notepad, SW_NORMAL);system(notepad);1.7 C語言編譯過程1.7.1 C程序編譯步驟C代碼編譯成可執(zhí)行程序經(jīng)過4步:1) 預(yù)處理:宏定義展開、頭文件展開、條件編譯等,同時將代碼中的注釋刪除,這里并不會檢查語法2) 編譯:檢查語法,將預(yù)處理后文件編譯生成匯編文件3) 匯編:將匯編文件生成目標(biāo)文件(二進(jìn)制文件)4) 鏈接:C語言寫的程序是需要依賴各種庫的,所以編譯之后還需要把庫鏈接到最終的可執(zhí)行程序中去1.7.2 gcc編譯過程1) 分步編譯預(yù)處理:gcc -E hello.c -o hello.i編 譯:gcc -S hello.i -o hello.s匯 編:gcc -c hello.s -o hello.o鏈 接:gcc hello.o -o hello_elf選項含義-E只進(jìn)行預(yù)處理-S(大寫)只進(jìn)行預(yù)處理和編譯-c(小寫)只進(jìn)行預(yù)處理、編譯和匯編-o file指定生成的輸出文件名為 file文件后綴含義.cC 語言文件.i預(yù)處理后的 C 語言文件.s編譯后的匯編文件.o編譯后的目標(biāo)文件2) 一步編譯gcc hello.c -o demo(還是經(jīng)過:預(yù)處理、編譯、匯編、鏈接的過程):1.7.3 查找程序所依賴的動態(tài)庫1) Linux平臺下,ldd(“l(fā)”為字母) 可執(zhí)行程序:2) Windows平臺下,需要相應(yīng)軟件(Depends.exe):1.8 CPU內(nèi)部結(jié)構(gòu)與寄存器(了解)1.8.1 64位和32位系統(tǒng)區(qū)別l 寄存器是CPU內(nèi)部最基本的存儲單元l CPU對外是通過總線(地址、控制、數(shù)據(jù))來和外部設(shè)備交互的,總線的寬度是8位,同時CPU的寄存器也是8位,那么這個CPU就叫8位CPUl 如果總線是32位,寄存器也是32位的,那么這個CPU就是32位CPUl 有一種CPU內(nèi)部的寄存器是32位的,但總線是16位,準(zhǔn)32位CPUl 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以識別32位的指令l 在64位的CPU構(gòu)架上運行了64位的軟件操作系統(tǒng),那么這個系統(tǒng)是64位l 在64位的CPU構(gòu)架上,運行了32位的軟件操作系統(tǒng),那么這個系統(tǒng)就是32位l 64位的軟件不能運行在32位的CPU之上1.8.2 寄存器名字(了解)8位16位32位64位AAXEAXRAXBBXEBXRBXCCXECXRCXDDXEDXRDX1.8.3 寄存器、緩存、內(nèi)存三者關(guān)系按與CPU遠(yuǎn)近來分,離得最近的是寄存器,然后緩存(CPU緩存),最后內(nèi)存。CPU計算時,先預(yù)先把要用的數(shù)據(jù)從硬盤讀到內(nèi)存,然后再把即將要用的數(shù)據(jù)讀到寄存器。于是 CPU寄存器內(nèi)存,這就是它們之間的信息交換。那為什么有緩存呢?因為如果老是操作內(nèi)存中的同一址地的數(shù)據(jù),就會影響速度。于是就在寄存器與內(nèi)存之間設(shè)置一個緩存。因為從緩存提取的速度遠(yuǎn)高于內(nèi)存。當(dāng)然緩存的價格肯定遠(yuǎn)遠(yuǎn)高于內(nèi)存,不然的話,機(jī)器里就沒有內(nèi)存的存在。由此可以看出,從遠(yuǎn)近來看:CPU-寄存器- 緩存 內(nèi)存。1.9 匯編語言1.9.1 VS中C語言嵌套匯編代碼(了解)#include int main()/定義整型變量a, b, cint a;int b;int c;_asmmov a, 3/3的值放在a對應(yīng)內(nèi)存的位置mov b, 4/4的值放在a對應(yīng)內(nèi)存的位置mov eax, a/把a內(nèi)存的值放在eax寄存器add eax, b/eax和b相加,結(jié)果放在eaxmov c, eax/eax的值放在c中printf(%dn, c);/把c的值輸出return 0;/成功完成1.9.2 VS反匯編#include int main()/定義整型變量a, b, cint a;int b;int c;a = 3;b = 4;c = a + b;printf(%dn, c);/把c的值輸出return 0;/成功完成1) 設(shè)置斷點F92) 選擇反匯編按鈕3) 根據(jù)匯編代碼分析程序1.10 集成開發(fā)環(huán)境IDE集成開發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。集成了代碼編寫功能、分析功能、編譯功能、調(diào)試功能等一體化的開發(fā)軟件服務(wù)套。所有具備這一特性的軟件或者軟件套(組)都可以叫集成開發(fā)環(huán)境。1.10.1 Qt CreatorQt Creator是跨平臺的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收購后推出的一款新的輕量級集成開發(fā)環(huán)境(IDE)。此 IDE 能夠跨平臺運行,支持的系統(tǒng)包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根據(jù)官方描述,Qt Creator 的設(shè)計目標(biāo)是使開發(fā)人員能夠利用 Qt 這個應(yīng)用程序框架更加快速及輕易的完成開發(fā)任務(wù)??旖萱I含義Ctrl + i自動格式化代碼Ctrl + /注釋/取消注釋Alt + Enter自動完成類函數(shù)定義F4.h 文件和對應(yīng).cpp 文件切換F9設(shè)置斷點F5調(diào)試運行Ctrl + r編譯,但不調(diào)試運行Ctrl + b編譯,不運行F10next調(diào)試F11step調(diào)試1.10.2 Microsoft Visual StudioMicrosoft Visual Studio(簡稱VS)是美國微軟公司的開發(fā)工具包系列產(chǎn)品。VS是一個基本完整的開發(fā)工具集,它包括了整個軟件生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開發(fā)環(huán)境(IDE)等等,所寫的目標(biāo)代碼適用于微軟支持的所有平臺。Visual Studio是目前最流行的Windows平臺應(yīng)用程序的集成開發(fā)環(huán)境。1) VS常用快捷鍵快捷鍵含義Ctrl + k,Ctrl + f自動格式化代碼Ctrl + k,Ctrl + c注釋代碼Ctrl + k,Ctrl + u取消注釋代碼F9設(shè)置斷點F5調(diào)試運行Ctrl + F5不調(diào)試運行Ctrl + Shift + b編譯,不運行F10next調(diào)試F11step調(diào)試2) VS2013的C4996錯誤由于微軟在VS2013中不建議再使用C的傳統(tǒng)庫函數(shù)scanf,strcpy,sprintf等,所以直接使用這些庫函數(shù)會提示C4996錯誤:VS建議采用帶_s的函數(shù),如scanf_s、strcpy_s,但這些并不是標(biāo)準(zhǔn)C函數(shù)。要想繼續(xù)使用此函數(shù),需要在源文件中添加以下指令就可以避免這個錯誤提示:#define _CRT_SECURE_NO_WARNINGS /這個宏定義最好要放到.c文件的第一行#pragma warning(disable:4996)/或者使用這個2. 數(shù)據(jù)類型2.1 常量與變量2.1.1 關(guān)鍵字2.1.2 數(shù)據(jù)類型數(shù)據(jù)類型的作用:編譯器預(yù)算對象(變量)分配的內(nèi)存空間大小。2.1.3 常量常量:l 在程序運行過程中,其值不能被改變的量l 常量一般出現(xiàn)在表達(dá)式或賦值語句中整型常量100,200,-100,0實型常量3.14 , 0.125,-3.123字符型常量a,b,1,n字符串常量“a”,“ab”,“12356”2.1.4 變量1) 變量變量:l 在程序運行過程中,其值可以改變l 變量在使用前必須先定義,定義變量前必須有相應(yīng)的數(shù)據(jù)類型標(biāo)識符命名規(guī)則:l 標(biāo)識符不能是關(guān)鍵字l 標(biāo)識符只能由字母、數(shù)字、下劃線組成l 第一個字符必須為字母或下劃線l 標(biāo)識符中字母區(qū)分大小寫變量特點:l 變量在編譯時為其分配相應(yīng)的內(nèi)存空間l 可以通過其名字和地址訪問相應(yīng)內(nèi)存2) 聲明和定義區(qū)別l 聲明變量不需要建立存儲空間,如:extern int a;l 定義變量需要建立存儲空間,如:int b;#include int main()/extern 關(guān)鍵字只做聲明,不能做任何定義,后面還會學(xué)習(xí),這里先了解/聲明一個變量a,a在這里沒有建立存儲空間extern int a;a = 10;/err, 沒有空間,就不可以賦值int b = 10;/定義一個變量b,b的類型為int,b賦值為10return 0;從廣義的角度來講聲明中包含著定義,即定義是聲明的一個特例,所以并非所有的聲明都是定義:l int b 它既是聲明,同時又是定義l 對于 extern b來講它只是聲明不是定義一般的情況下,把建立存儲空間的聲明稱之為“定義”,而把不需要建立存儲空間的聲明稱之為“聲明”。2.1.5 使用示例#include #define MAX 10 /聲明了一個常量,名字叫MAX,值是10,常量的值一旦初始化不可改int main()int a;/定義了一個變量,其類型為int,名字叫aconst int b = 10; /定義一個const常量,名為叫b,值為10/b = 11; /err,常量的值不能改變/MAX = 100;/err,常量的值不能改變a = MAX;/將abc的值設(shè)置為MAX的值a = 123;printf(%dn, a); /打印變量a的值return 0;2.2 進(jìn)制進(jìn)制也就是進(jìn)位制,是人們規(guī)定的一種進(jìn)位方法。 對于任何一種進(jìn)制X進(jìn)制,就表示某一位置上的數(shù)運算時是逢X進(jìn)一位。 十進(jìn)制是逢十進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一,以此類推,x進(jìn)制就是逢x進(jìn)位。十進(jìn)制二進(jìn)制八進(jìn)制十六進(jìn)制000011112102231133410044510155611066711177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F161000020102.2.1 二進(jìn)制二進(jìn)制是計算技術(shù)中廣泛采用的一種數(shù)制。二進(jìn)制數(shù)據(jù)是用0和1兩個數(shù)碼來表示的數(shù)。它的基數(shù)為2,進(jìn)位規(guī)則是“逢二進(jìn)一”,借位規(guī)則是“借一當(dāng)二”。當(dāng)前的計算機(jī)系統(tǒng)使用的基本上是二進(jìn)制系統(tǒng),數(shù)據(jù)在計算機(jī)中主要是以補碼的形式存儲的。術(shù)語含義bit(比特)一個二進(jìn)制代表一位,一個位只能表示0或1兩種狀態(tài)。數(shù)據(jù)傳輸是習(xí)慣以“位”(bit)為單位。Byte(字節(jié))一個字節(jié)為8個二進(jìn)制,稱為8位,計算機(jī)中存儲的最小單位是字節(jié)。數(shù)據(jù)存儲是習(xí)慣以“字節(jié)”(Byte)為單位。WORD(雙字節(jié))2個字節(jié),16位DWORD兩個WORD,4個字節(jié),32位1b1bit,1位1B1Byte,1字節(jié),8位1k,1K10241M(1兆)1024k, 1024*10241G1024M1T1024G1Kb(千位)1024bit,1024位1KB(千字節(jié))1024Byte,1024字節(jié)1Mb(兆位)1024Kb = 1024 * 1024bit1MB(兆字節(jié))1024KB = 1024 * 1024Byte十進(jìn)制轉(zhuǎn)化二進(jìn)制的方法:用十進(jìn)制數(shù)除以2,分別取余數(shù)和商數(shù),商數(shù)為0的時候,將余數(shù)倒著數(shù)就是轉(zhuǎn)化后的結(jié)果。十進(jìn)制的小數(shù)轉(zhuǎn)換成二進(jìn)制:小數(shù)部分和2相乘,取整數(shù),不足1取0,每次相乘都是小數(shù)部分,順序看取整后的數(shù)就是轉(zhuǎn)化后的結(jié)果。2.2.2 八進(jìn)制八進(jìn)制,Octal,縮寫OCT或O,一種以8為基數(shù)的計數(shù)法,采用0,1,2,3,4,5,6,7八個數(shù)字,逢八進(jìn)1。一些編程語言中常常以數(shù)字0開始表明該數(shù)字是八進(jìn)制。八進(jìn)制的數(shù)和二進(jìn)制數(shù)可以按位對應(yīng)(八進(jìn)制一位對應(yīng)二進(jìn)制三位),因此常應(yīng)用在計算機(jī)語言中。十進(jìn)制轉(zhuǎn)化八進(jìn)制的方法:用十進(jìn)制數(shù)除以8,分別取余數(shù)和商數(shù),商數(shù)為0的時候,將余數(shù)倒著數(shù)就是轉(zhuǎn)化后的結(jié)果。2.2.3 十六進(jìn)制十六進(jìn)制(英文名稱:Hexadecimal),同我們?nèi)粘I钪械谋硎痉ú灰粯?,它?-9,A-F組成,字母不區(qū)分大小寫。與10進(jìn)制的對應(yīng)關(guān)系是:0-9對應(yīng)0-9,A-F對應(yīng)10-15。十六進(jìn)制的數(shù)和二進(jìn)制數(shù)可以按位對應(yīng)(十六進(jìn)制一位對應(yīng)二進(jìn)制四位),因此常應(yīng)用在計算機(jī)語言中。十進(jìn)制轉(zhuǎn)化十六進(jìn)制的方法:用十進(jìn)制數(shù)除以16,分別取余數(shù)和商數(shù),商數(shù)為0的時候,將余數(shù)倒著數(shù)就是轉(zhuǎn)化后的結(jié)果。2.2.4 C語言如何表示相應(yīng)進(jìn)制數(shù)十進(jìn)制以正常數(shù)字1-9開頭,如123八進(jìn)制以數(shù)字0開頭,如0123十六進(jìn)制以0x開頭,如0x123二進(jìn)制C語言不能直接書寫二進(jìn)制數(shù)#include int main()int a = 123;/十進(jìn)制方式賦值int b = 0123;/八進(jìn)制方式賦值, 以數(shù)字0開頭int c = 0xABC;/十六進(jìn)制方式賦值/如果在printf中輸出一個十進(jìn)制數(shù)那么用%d,八進(jìn)制用%o,十六進(jìn)制是%xprintf(十進(jìn)制:%dn,a );printf(八進(jìn)制:%on, b);/%o,為字母o,不是數(shù)字printf(十六進(jìn)制:%xn, c);return 0;2.3 計算機(jī)內(nèi)存數(shù)值存儲方式2.3.1 原碼一個數(shù)的原碼(原始的二進(jìn)制碼)有如下特點:l 最高位做為符號位,0表示正,為1表示負(fù)l 其它數(shù)值部分就是數(shù)值本身絕對值的二進(jìn)制數(shù)l 負(fù)數(shù)的原碼是在其絕對值的基礎(chǔ)上,最高位變?yōu)?下面數(shù)值以1字節(jié)的大小描述:十進(jìn)制數(shù)原碼+150000 1111-151000 1111+00000 0000-01000 0000原碼表示法簡單易懂,與帶符號數(shù)本身轉(zhuǎn)換方便,只要符號還原即可,但當(dāng)兩個正數(shù)相減或不同符號數(shù)相加時,必須比較兩個數(shù)哪個絕對值大,才能決定誰減誰,才能確定結(jié)果是正還是負(fù),所以原碼不便于加減運算。2.3.2 反碼l 對于正數(shù),反碼與原碼相同l 對于負(fù)數(shù),符號位不變,其它部分取反(1變0,0變1)十進(jìn)制數(shù)反碼+150000 1111-151111 0000+00000 0000-01111 1111反碼運算也不方便,通常用來作為求補碼的中間過渡。2.3.3 補碼在計算機(jī)系統(tǒng)中,數(shù)值一律用補碼來存儲。補碼特點:l 對于正數(shù),原碼、反碼、補碼相同l 對于負(fù)數(shù),其補碼為它的反碼加1l 補碼符號位不動,其他位求反,最后整個數(shù)加1,得到原碼十進(jìn)制數(shù)補碼+150000 1111-151111 0001+00000 0000-00000 0000#include int main()int a = -15;printf(%xn, a);/結(jié)果為 fffffff1/fffffff1對應(yīng)的二進(jìn)制:1111 1111 1111 1111 1111 1111 1111 0001/符號位不變,其它取反:1000 0000 0000 0000 0000 0000 0000 1110/上面加1:1000 0000 0000 0000 0000 0000 0000 1111 最高位1代表負(fù)數(shù),就是-15return 0;2.3.4 補碼的意義示例1:用8位二進(jìn)制數(shù)分別表示+0和-0十進(jìn)制數(shù)原碼+00000 0000-01000 0000十進(jìn)制數(shù)反碼+00000 0000-01111 1111不管以原碼方式存儲,還是以反碼方式存儲,0也有兩種表示形式。為什么同樣一個0有兩種不同的表示方法呢?但是如果以補碼方式存儲,補碼統(tǒng)一了零的編碼:十進(jìn)制數(shù)補碼+0 0000 0000-010000 0000由于只用8位描述,最高位1丟棄,變?yōu)?000 0000示例2:計算9-6的結(jié)果以原碼方式相加:十進(jìn)制數(shù)原碼90000 1001-61000 0110結(jié)果為-15,不正確。以補碼方式相加:十進(jìn)制數(shù)補碼90000 1001-61111 1010最高位的1溢出,剩余8位二進(jìn)制表示的是3,正確。在計算機(jī)系統(tǒng)中,數(shù)值一律用補碼來存儲,主要原因是:l 統(tǒng)一了零的編碼l 將符號位和其它位統(tǒng)一處理l 將減法運算轉(zhuǎn)變?yōu)榧臃ㄟ\算l 兩個用補碼表示的數(shù)相加時,如果最高位(符號位)有進(jìn)位,則進(jìn)位被舍棄2.4 sizeof關(guān)鍵字l sizeof不是函數(shù),所以不需要包含任何頭文件,它的功能是計算一個數(shù)據(jù)類型的大小,單位為字節(jié)l sizeof的返回值為size_tl size_t類型在32位操作系統(tǒng)下是unsigned int,是一個無符號的整數(shù)#include int main()int a;int b = sizeof(a);/sizeof得到指定值占用內(nèi)存的大小,單位:字節(jié)printf(b = %dn, b);size_t c = sizeof(a);printf(c = %un, c);/用無符號數(shù)的方式輸出c的值return 0;2.5整型:int2.5.1 整型變量的定義和輸出打印格式含義%d輸出一個有符號的10進(jìn)制int類型%o(字母o)輸出8進(jìn)制的int類型%x輸出16進(jìn)制的int類型,字母以小寫輸出%X輸出16進(jìn)制的int類型,字母以大寫寫輸出%u輸出一個10進(jìn)制的無符號數(shù)#include int main()int a = 123;/定義變量a,以10進(jìn)制方式賦值為123int b = 0567;/定義變量b,以8進(jìn)制方式賦值為0567int c = 0xabc;/定義變量c,以16進(jìn)制方式賦值為0xabcprintf(a = %dn, a);printf(8進(jìn)制:b = %on, b);printf(10進(jìn)制:b = %dn, b);printf(16進(jìn)制:c = %xn, c);printf(16進(jìn)制:c = %Xn, c);printf(10進(jìn)制:c = %dn, c);unsigned int d = 0xffffffff; /定義無符號int變量d,以16進(jìn)制方式賦值printf(有符號方式打?。篸 = %dn, d);printf(無符號方式打?。篸 = %un, d);return 0;2.5.2 整型變量的輸入#include int main()int a;printf(請輸入a的值:);/不要加“n”scanf(%d, &a);printf(a = %dn, a); /打印a的值return 0;2.5.3 short、int、long、long long數(shù)據(jù)類型占用空間short(短整型)2字節(jié)int(整型)4字節(jié)long(長整形)Windows為4字節(jié),Linux為4字節(jié)(32位),8字節(jié)(64位)long long(長長整形)8字節(jié)注意:l 需要注意的是,整型數(shù)據(jù)在內(nèi)存中占的字節(jié)數(shù)與所選擇的操作系統(tǒng)有關(guān)。雖然 C 語言標(biāo)準(zhǔn)中沒有明確規(guī)定整型數(shù)據(jù)的長度,但 long 類型整數(shù)的長度不能短于 int 類型, short 類型整數(shù)的長度不能短于 int 類型。l 當(dāng)一個小的數(shù)據(jù)類型賦值給一個大的數(shù)據(jù)類型,不會出錯,因為編譯器會自動轉(zhuǎn)化。但當(dāng)一個大的類型賦值給一個小的數(shù)據(jù)類型,那么就可能丟失高位。整型常量所需類型10代表int類型10l, 10L代表long類型10ll, 10LL代表long long類型10u, 10U代表unsigned int類型10ul, 10UL代表unsigned long類型10ull, 10ULL代表unsigned long long類型打印格式含義%hd輸出short類型%d輸出int類型%l輸出long類型%ll輸出long long類型%hu輸出unsigned short類型%u輸出unsigned int類型%lu輸出unsigned long類型%llu輸出unsigned long long類型#include int main()short a = 10;int b = 10;long c = 10l; /或者10Llong long d = 10ll; /或者10LLprintf(sizeof(a) = %un, sizeof(a);printf(sizeof(b) = %un, sizeof(b);printf(sizeof(c) = %un, sizeof(c);printf(sizeof(c) = %un, sizeof(d);printf(short a = %hdn, a);printf(int b = %dn, b);printf(long c = %ldn, c);printf(long long d = %lldn, d);unsigned short a2 = 20u;unsigned int b2 = 20u;unsigned long c2= 20ul; unsigned long long d2 = 20ull; printf(unsigned short a = %hun, a2);printf(unsigned int b = %un, b2);printf(unsigned long c = %lun, c2);printf(unsigned long long d = %llun, d2);return 0;2.5.4 有符號數(shù)和無符號數(shù)區(qū)別1) 有符號數(shù)有符號數(shù)是最高位為符號位,0代表正數(shù),1代表負(fù)數(shù)。#include int main()signed int a = -1089474374; /定義有符號整型變量aprintf(%Xn, a); /結(jié)果為 BF0FF0BA/B F 0 F F 0 B A/1011 1111 0000 1111 1111 0000 1011 1010return 0;2) 無符號數(shù)無符號數(shù)最高位不是符號位,而就是數(shù)的一部分,無符號數(shù)不可能是負(fù)數(shù)。#include int main()unsigned int a = 3236958022; /定義無符號整型變量aprintf(%Xn, a); /結(jié)果為 C0F00F46return 0;當(dāng)我們寫程序要處理一個不可能出現(xiàn)負(fù)值的時候,一般用無符號數(shù),這樣可以增大數(shù)的表達(dá)最大值。3) 有符號和無符號整型取值范圍數(shù)據(jù)類型占用空間取值范圍short2字節(jié)-32768 到 32767 (-215 215-1)int4字節(jié)-2147483648 到 2147483647 (-231 231-1)long4字節(jié)-2147483648 到 2147483647 (-231 231-1)unsigned short2字節(jié)0 到 65535 (0 216-1)unsigned int4字節(jié)0 到 4294967295 (0 232-1)unsigned long4字節(jié)0 到 4294967295 (0 232-1)2.6字符型:char2.6.1 字符變量的定義和輸出字符型變量用于存儲一個單一字符,在 C 語言中用 char 表示,其中每個字符變量都會占用 1 個字節(jié)。在給字符型變量賦值時,需要用一對英文半角格式的單引號( )把字符括起來。字符變量實際上并不是把該字符本身放到變量的內(nèi)存單元中去,而是將該字符對應(yīng)的 ASCII 編碼放到變量的存儲單元中。char的本質(zhì)就是一個1字節(jié)大小的整型。#include int main()char ch = a;printf(sizeof(ch) = %un, sizeof(ch);printf(ch%c = %cn, ch); /打印字符printf(ch%d = %dn, ch); /打印a ASCII的值char A = A;char a = a;printf(a = %dn, a);/97printf(A = %dn, A);/65printf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 助理廣告師考試消費市場趨勢分析試題及答案
- 太原社區(qū)面試題及答案
- 全科醫(yī)學(xué)試題及答案詳解
- 地理西亞測試題及答案
- 2024年國際商業(yè)設(shè)計師考試備考要點試題及答案
- 助理廣告師考試數(shù)據(jù)分析基礎(chǔ)試題及答案
- c語言測試試題及答案
- 商業(yè)設(shè)計師考試全新試題及答案揭曉
- 2024年職稱考試紡織品檢驗問答試題及答案
- 破解國際商業(yè)美術(shù)設(shè)計師考試難題試題及答案
- 優(yōu)化醫(yī)患溝通提高腫瘤治療效果的途徑
- 2025北京九年級(上)期末語文匯編:文言文閱讀
- 越出站界調(diào)車RAILWAY課件
- 部隊物資儲備管理制度
- 河北武安招聘警務(wù)輔助人員筆試真題2024
- 2025年高級插花花藝師(三級)理論考試題(附答案)
- 脊柱損傷搬運操作
- 醫(yī)院醫(yī)用耗材培訓(xùn)
- 2025年五年級下冊英語單詞表
- 布魯氏菌病培訓(xùn)課件
- 2025年古董拍賣收藏品買賣協(xié)議書
評論
0/150
提交評論