C語言基礎知識點複習

2021-09-25 02:58:44 字數 3119 閱讀 1352

c語言中的資料型別通常有short、int、long、float、double、char六種型別。在32位的cpu中,各個資料型別所佔的位元組數分別為2,4,4,4,8,1。

1.c語言中常用各資料型別及其取值範圍

有符號整數型別

型別名稱

位元組數取值範圍

char

2-2^7 ~ 2^7-1

short int

4-2^15 ~ 2^15-1

int4

-2^31 ~ 2^31-1

long int

4-2^31 ~ 2^31-1

long long int

8-2^63 ~ 2^63-1

無符號整數型別

型別名稱

位元組數取值範圍

unsigned char

10 ~ 2^8

unsigned short

20 ~ 2^16

unsigned int

40 ~2^32

unsigned long

40 ~ 2^32

unsigned long long

80 ~ 2^64

1、結構體struct

各成員各自擁有自己的記憶體,各自使用互不干涉,同時存在的,遵循記憶體對齊原則。乙個struct變數的總長度等於所有成員的長度之和。

2、聯合體union

各成員共用一塊記憶體空間,並且同時只有乙個成員可以得到這塊記憶體的使用權(對該記憶體的讀寫),各變數共用乙個記憶體首位址。因而,聯合體比結構體更節約記憶體。乙個union變數的總長度至少能容納最大的成員變數,而且要滿足是所有成員變數型別大小的整數倍。

**1:struct位元組對齊

在結構體u2中,a佔4個位元組,後面b和c共佔3個位元組,正好乙個位元組補齊;u3中b佔1個位元組,要和後面的int位元組對齊就要補齊三個位元組,後面的c也要補齊2個位元組,所以u3共佔12個位元組。想要改變這種位元組對齊方式,可以用:

#pragma pack (2) /*指定按2位元組對齊*/

#pragma pack () /*取消指定對齊,恢復預設對齊*/

#includestruct u1

u2;

struct u2

u3;

int main()

//輸出為

//8//12

**2:union大小計算

計算union的大小,必須要滿足兩個規則:(1)需要能夠容納最大的成員變數的大小;(2)滿足是所有成員變數資料大小的整數倍

**中u3至少容納最大e[5]=20位元組,同時變數型別最大值是整數倍,即使double(位元組數是8)的整數倍,因而sizeof(u3)=24。 

#includeunion u2  //u2聯合體變數名

u3;

//主函式

int main()

計算機的資料以01構成的位元組儲存,這就涉及資料大小端的問題。計算機是大端資料模式還是小端資料模式對於普通的應用程式沒有什麼影響,但是在諸如網路程式設計、晶元暫存器操作的時候就有必要區分一下了,要不然會遇到程式的邏輯設計完全沒問題,但得到的資料總是錯誤的尷尬。這裡詳細介紹一下這兩種資料模式的差異,以及結合實際應用例子來檢驗我們主機的位元組順序模式。

位元組順序模式

計算機的位元組順序模式分為大端資料模式小端資料模式,它們是根據資料在記憶體中的儲存方式來區分的。小端位元組順序的資料儲存模式是按記憶體增大的方向儲存的,即低位在前高位在後;大端位元組順序的資料儲存方向恰恰是相反的,即高位在前,低位在後。純文字描述有點抽象,我們結合乙個例子來說明乙個16位的資料0xabcd在不同位元組順序的計算機記憶體中的儲存情況。小端位元組順序中的資料儲存是按照記憶體增長的方向儲存的,0xabcd中的0xcd屬於低位資料,故存在低八位,0xab屬於高位資料,故儲存高八位;大端位元組順序中的資料儲存就反過來,高位資料0xab儲存在低八位,低位資料0xcdb儲存在高八位。小結:計算機的位元組順序模式就是資料在記憶體中儲存方式的不同,小端資料模式與記憶體增長方向一致,大端資料模式與記憶體增長方向相反。

位元組順序應用

對位元組順序敏感的程式設計涉及的範圍較多,這裡以網路程式設計晶元操作來說明大小端資料模式的轉換問題。首先來說說網路程式設計,我們知道網路上的資料都是以大端資料模式進行互動的,而我們的主機大多數是以小端資料模式進行處理,它們如果不進行轉換的話,勢必會引起資料混亂。所以在網路程式設計中可以利用htons()、htonl()分別將16位、32位主機資料轉換為網路位元組序;ntohs()、ntohl()則分別將16位、32位網路位元組序轉換為主機資料。

另乙個應用是晶元操作,這一塊在嵌入式系統中應用比較多,一般在晶元的說明手冊中都會詳細說明晶元通訊時使用的資料格式,如果遇到與主機的位元組順序不一樣的,我們必須進行轉換。假設晶元輸出選用大端資料格式、主機是小端資料格式,當它們進行資料互動時,需要進行轉換,比如主機想要傳送乙個16位的操作指令,我們可以通過移位、位與、位或等操作將資料進行位元組順序的轉換。

檢測主機位元組順序**

了解大小端位元組順序後,我們如何知道我們的主機是用什麼位元組順序呢。它的原理也很簡單,利用共用體共用一段相同的記憶體,然後我們定義兩個的變數(這裡是short int與char),然後對長變數(short int 16位)進行初始化,接著按位元組(char 8位)讀取列印出來比較即可知道主機的位元組順序。

#include typedef union 

to;int main(int argc.char *ar**)

if(typeorder.byte[0] == 0xab && typeorder.byte[1] == 0xcd)

return 0;

}

C 基礎知識點複習

識別符號 字母,數字,下劃線,開頭不能是數字.不能是關鍵字 for 初始化語句 判斷條件語句 控制條件語句 struct 結構體賦值的三種方式 依次給每乙個成員變數賦值 使用已有的結構體變數賦值 memset 賦值 true false 1 內部類和外部類沒有任何關係,不是朋友也不是父子 內部類也看...

linux基礎知識點複習

暫時先放一些linux的一些操作的東西 1 vm 虛擬機器 2 redhad 作業系統 3 xshell 終端軟體 4 notepad 編碼 5 課件 思維導圖 mindmanage word ppt xshell nat模式連線 ssh ip位址 注意 1 必須要有網 2 虛擬機器的網絡卡要開啟 ...

java基礎知識點複習

物件導向程式設計有三大特性 封裝,繼承,多型 多型時父類跟子類的建構函式都會被呼叫?答 子類預設呼叫父類的無參構造方法,所以如果子類沒有顯示呼叫父類的構造方法,父類中沒有無參的的建構函式,編譯出錯 多型 1.實現多型的三個條件 a.必須要有繼承關係子類跟父類 b.子類要重寫父類的方法,子類對父類的方...