文章目錄
- 數據類型分類
- 1. 基本類型 (Basic Types)
- a. 整數類型 (Integer Types)
- char (字符型)
- int (整型)
- short (短整型)
- long (長整型)
- long long (C99標準引入)
- 圖片匯總
- b. 浮點類型 (Floating-Point Types)
- float (單精度浮點型)
- double (雙精度浮點型)
- long double (長雙精度浮點型)
- 圖片匯總
- 2. 枚舉類型 (Enumeration Type) - enum
- 3. void 類型
- 1、作為函數返回類型
- 2、作為函數參數
- 3、作為指針類型(萬能指針)
- 4. 派生類型 (Derived Types)
- a. 指針類型 (Pointer Types)
- b. 數組類型 (Array Types)
- c. 結構體類型 (Structure Type) - struct
- d. 共用體類型 (Union Type) - union
- e. 函數類型 (Function Types)
- 類型限定符 (Type Qualifiers)
在 C 語言中,數據類型指用于聲明不同類型的變量或函數。變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式。
數據類型分類
C 語言的數據類型主要可以分為以下幾大類:
1. 基本類型 (Basic Types)
a. 整數類型 (Integer Types)
用于存儲整數,可帶有符號。
注意:確切的大小和范圍依賴于編譯器和平臺。<limits.h> 頭文件定義了這些類型的最大值和最小值(如 INT_MAX, CHAR_BIT 等)。
char (字符型)
用途:存儲單個字符(實際上是存儲該字符的 ASCII 碼)。
大小:通常為 1 字節。
signed char(或直接寫char,signed通常可忽略):有符號,范圍至少 -128 到 127。
unsigned char:無符號,范圍至少 0 到 255。
注意:普通的 char 是否帶符號取決于編譯器的實現,它可能等同于 signed char 或 unsigned char。如果用于存儲小整數,應明確指定 signed 或 unsigned。
在MCU開發中通常使用UI_8、I_8表示C語言中8位的無符號、有符號數據類型。增強工程的可移植性。避免工程師在不同系統下對存儲空間大小認知存在偏差導致bug。
int (整型)
用途:最常用的整數類型,用于存儲通用整數。
大小:通常為系統字長4字節或者2字節(例如,在 32/64 位系統上通常是 4 字節,部分MCU系統中為2字節)。
范圍:至少 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647。
signed int (或直接寫 int,signed通常可忽略):有符號。
unsigned int:無符號,范圍至少 0 到 65,535 或 0 到 4,294,967,295。
在MCU開發中通常使用UI_32、I_32表示C語言中32位的無符號、有符號數據類型。增強工程的可移植性。避免工程師在不同系統下對存儲空間大小認知存在偏差導致bug。
short (短整型)
用途:用于節省空間的較小整數,范圍比 int 小。
大小:至少 2 字節。
signed short : -32,768 到 32,767
unsigned short: 0 到 65,535
在MCU開發中通常使用UI_16、I_16表示C語言中16位的無符號、有符號數據類型。增強工程的可移植性。避免工程師在不同系統下對存儲空間大小認知存在偏差導致bug。
long (長整型)
用途:存儲大范圍的整數。
大小:至少 4 字節,部分系統可能是8字節。
signed long:-2,147,483,648 到 2,147,483,647(4字節時)
unsigned long: 0 到 4,294,967,295(4字節時)
long long (C99標準引入)
long long (C99標準引入)
用途:存儲非常大范圍的整數。
大小:至少 8 字節
signed long long:0 到 18,446,744,073,709,551,615
unsigned long long:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
在MCU開發中通常使用UI_64、I_64表示C語言中64位的無符號、有符號數據類型。增強工程的可移植性。避免工程師在不同系統下對存儲空間大小認知存在偏差導致bug。
圖片匯總
圖片來自菜鳥教程:
菜鳥教程
b. 浮點類型 (Floating-Point Types)
用于存儲實數(帶小數點的數)。
注意:<float.h> 頭文件定義了這些類型的精度和范圍(如 FLT_DIG, DBL_MAX 等)。
float (單精度浮點型)
大小:通常為 4 字節。
精度:約 6-7 位有效數字。
后綴:字面量后綴 f 或 F,例如 3.14f。
double (雙精度浮點型)
大小:通常為 8 字節。
精度:約 15-16 位有效數字。
說明:C 語言中默認的浮點數字面量(如 3.14)都是 double 類型。
long double (長雙精度浮點型)
大小:通常為 8、12 或 16 字節,取決于實現。
精度:提供比 double 更高的精度和范圍。
圖片匯總
圖片來自菜鳥教程:
菜鳥教程
2. 枚舉類型 (Enumeration Type) - enum
用于定義一組命名的整數常量,使代碼更易讀。
枚舉變量在C語言中相當于是一個范圍限制的整數型,將同一層級同一概念的值封裝在一個枚舉類型中,提高代碼可讀性,使用時相當于宏定義。
// 定義了一個枚舉類型 enum Color
enum Color {RED, // 默認值為 0GREEN, // 默認值為 1BLUE // 默認值為 2
};// 聲明一個枚舉變量
enum Color myColor = GREEN;
printf("%d\n", myColor); // 輸出 1// 可以顯式指定值
enum Status {ERROR = -1,SUCCESS = 0,PENDING = 1
};
3. void 類型
void 類型表示“無”或“空”。
1、作為函數返回類型
表示函數不返回任何值。
void sayHello() {printf("Hello\n");// 無需 return 語句,或使用 return;
}
2、作為函數參數
表示函數不接受任何參數。
int getRandomNumber(void) { // 明確表示無參數return rand();
}
3、作為指針類型(萬能指針)
void* 是一種通用指針類型,可以指向任何數據類型的數據。在使用前必須進行強制類型轉換。
int num = 10;
void *ptr = # // 合法// printf("%d\n", *ptr); // 錯誤:void* 不能直接解引用
printf("%d\n", *((int*)ptr)); // 正確:先轉換為 int*
4. 派生類型 (Derived Types)
這些類型是從基本類型或其它派生類型構造而來的。
a. 指針類型 (Pointer Types)
存儲變量的內存地址。聲明時在類型名后加 *。
int num = 10;
int *ptr = # // ptr 是一個指向 int 的指針,存儲了 num 的地址printf("%d\n", *ptr); // 解引用指針,獲取它指向的值(輸出 10)
b. 數組類型 (Array Types)
存儲相同類型的元素的集合。聲明時在變量名后加 [size]。
int numbers[5] = {1, 2, 3, 4, 5}; // 包含 5 個整數的數組
char str[] = "Hello"; // 編譯器自動計算大小的字符數組(字符串)
c. 結構體類型 (Structure Type) - struct
將多個不同類型的變量組合成一個單一的復合類型。
// 定義了一個結構體類型 struct Person
struct Person {char name[50];int age;float height;
};// 聲明一個結構體變量并初始化
struct Person p1 = {"Alice", 30, 165.5};// 訪問成員
printf("Name: %s, Age: %d\n", p1.name, p1.age);
d. 共用體類型 (Union Type) - union
允許在同一內存位置存儲不同的數據類型。所有成員共享同一塊內存,大小由最大的成員決定。
union Data {int i;float f;char str[20];
};union Data data;
data.i = 10; // 現在 data 存儲的是一個整數
data.f = 220.5; // 寫入一個浮點數,會覆蓋之前的整數
// 此時讀取 data.i 將是無意義的值
e. 函數類型 (Function Types)
函數也有類型,由其返回類型和參數類型決定。這在函數指針中非常有用。
// 一個函數類型:返回 int,接受兩個 int 參數
int add(int a, int b) {return a + b;
}// 聲明一個匹配該類型的函數指針
int (*funcPtr)(int, int) = add;// 通過函數指針調用函數
int result = funcPtr(3, 4); // result = 7
類型限定符 (Type Qualifiers)
為類型提供額外的屬性。
1、const:定義常量,值在初始化后不能被修改。
const int max_size = 100;
// max_size = 200; // 編譯錯誤!
2、volatile:告訴編譯器該變量可能被程序之外的代理(如硬件、中斷)修改,禁止編譯器做某些優化。
volatile int hardware_register;
3、restrict (C99):一個指針限定符,向編譯器承諾,在該指針的生命周期內,它是訪問其所指向數據的唯一方式,從而允許編譯器進行優化。