一、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 辨別常量名 表達式
宏替換為格式的完全替換