天天看點

C語言中對資料類型的了解

一、C語言的操作對象

C語言的操作對象:資源/記憶體(記憶體類型的資源,LCD緩存、LED燈、序列槽、I2C裝置等)

C語言如何描述這些資源的屬性

資源屬性即大小

限制記憶體(土地)的大小,關鍵字==》char int long short 等

二、編譯器與硬體

定義int a; sizeof(a) 的值到底是幾,這是取決于編譯器,針對不同的硬體(架構、字長)會采用不同的編譯器,sizeof預設傳回unsigned long類型 是以在列印sizeof的值時建議使用lu

三、基礎資料類型

1、 char類型

硬體晶片操作的最小機關

bit 1 0

軟體操作的最小機關:8 bit == 1B

應用場景:

(1)硬體處理的最小機關

比如硬體要發送一個字元串“12345”,此時,很明顯,使用char buf[XX]比int buf[XX]更合理

(2)ASCII碼表 沒有中文概念時,用8bit去描述鍵盤鍵值是足夠的

2、int 類型

編譯器最優的處理大小:

系統一個周期,所能接受的最大處理機關==>int

32位機 32bit 4B int

16位機 16bit 2B int ==》 TC2.0

整型常量

char a = 300; 300為整型常量,編譯器會預設按int大小配置設定空間

與變量名的差別:變量名必須是以字母數字下劃線開頭,是以,任何以數字開頭的字元串都被認定為常量,比如0b110011(2進制), 010(8進制),0x11(16進制),123(10進制)

16位機整型int為2個位元組,最大表示的數為65536 當使用66666的整型常量時,雖然會通過編譯,但是由于編譯器按照整型int來存儲66666,是以會造成錯誤。

 ==》解決方案:在數字後加上l或者L 66666l 或 66666L 顯式告訴編譯器以long類型給常量配置設定空間

3、short 當變量的配置設定空間有着嚴格的限制,必須剛好和short一樣大時采用short類型

4、long 一般用于變量大小的擴充 比如long long 用于大資料

5、邏輯類型 bool :使用時需要頭檔案 stdbool.h

值域: true(非零)、false(零)

特點:非零為真,零值為假。

6、unsigned signed 有符号數和無符号數的差別

記憶體空間的最高位(bit)是符号位還是資料

無符号:資料采集(攝像頭資料,顯示卡産生的資料)

有符号:數字運算(+-*/)

7、float double 類型

記憶體存在的形式

數字形式:0x10 16進制

記憶體形式:0001 0000 16

注:浮點數在記憶體中的表現形式在不同的計算機體系中是不一緻的,是以無需關注

大小:

float 4B

double 8B

浮點型常量:

1.0 1.1 編譯器給浮點型常量預設配置設定為double類型,8B

1.0f 1.1f 顯式告訴編譯器浮點型常量配置設定為float類型,4B

8、void 類型

void a 隻是一種聲明,并不實際配置設定空間,在實際的使用中一般會進行強轉,強轉之後編譯器才會指定變量占用的空間。或者用于函數的傳回值聲明,表示沒有傳回值。

注:在不同的系統中,各種類型資料長度不一緻,但是都遵循該原則:長整型的位元組大小至少要不小于整型的位元組大小,整型的位元組大小至少要不小于短整型的位元組大小。

有待考究的問題:

右移操作時必須關注資料是否是有符号的

比如:char a = -1; 0xff

a>>1 不斷的右移1位 ==》無法變成0 ????????

unsigned char b = -1;

b>>1 不斷的右移1位 ==》最後會變成0 ????????

四、自定義資料類型

C編譯器預設定義的記憶體配置設定(基礎資料類型)不符合實際資源的形式,就形成了自定義資料類型(基本元素的集合)

1、struct 元素之間的和

struct myabc {

unsigned char a;

unsigned int b;

usigned long c;

};

struct myabc mybuff;

struct 是告訴編譯器即将定義一個自定義資料類型

myabc不是變量,而是自定義資料類型的名稱

mybuff 是變量名 struct myabc是類型修飾

順序也是有要求的,順序的不同也會對最終的結構體大小産生影響(記憶體對齊)

(2)union

共用起始位址的一段記憶體

應用于一些技巧性的代碼

union myabc {

char a;

int b;

};

變量的定義方式:union myabc abc;

(3)enum類型

enumerate:一一列舉

被命名的整型常數的集合

enum 枚舉名稱{常量清單};

情形1:

#define MON 0

#define TUE 1

#define WED 2

情形2:

enum abc{MOD = 0,TUE,WED}

 情形1和情形2等價

舉例:

enum week{

Monday = 0,Tuesday = 1,Wednesday = 2,

Tuursday,Friday,

Saturday,Sunday

};

enum week day;

enum week 聲明day是一個week類型枚舉類型,day配置設定的空間同整型常量(int,Sizeof(day) =4),原則上限制day的取值隻能為0~6,但是很多編譯器其實隻是把day當成一個int大小記憶體空間的名稱而已,并不會真的限制其取值,是以day = 8,很多時候也是成立的,具體的和編譯器也有關系

Enum多數情況下隻是将某一類的整型常量放到一起,起一個适合實際應用的名稱,友善閱讀和了解。

(4)typedef

資料類型的别名

情形1:

int a = 170;

int b = 3600;

 隻知道配置設定了int大小的空間,但是并不知道a和b的用途

情形2:

len_t a = 170;

time_t b = 3600;

直覺的了解到a是用來表示長度,b是用來表示時間

舉例:

int a ==》a是一個int類型的變量

typedef int XXX_t XXX_t是一個int類型的外号

XXX_t mysize; 定義一個int類型的變量mysize

XXX_t:在linux程式設計中,這種類型基本都是使用typedef來定義的

五、關于常量

常量:在整個程式運作過程中其數值不發生改變的資料。

不能進行自增、自減運算。++ 、–。

常量不能作為指派運算符的左值。

1、整型常量 : 整數

2、浮點常量 : 實數

3、指數常量:+/-1.178e+/-13 == +/-1.178 * 10^13 或者 +/-1.178*10^(-13)

4、字元常量:用單引号‘’引起來的單個字元

字元常量具有數值,其數值為字元的ascii碼值

5、字元串常量:使用雙引号“”引起來的一串字元。

“beijing” “北京” “1234” “ >>>”

6、辨別常量:又稱為宏。便于程式的修改調試,增加程式的可讀性

一般形式: #define 辨別常量名 表達式

宏替換為格式的完全替換

繼續閱讀