| 數據類型 | 長度 | 值域 / 說明 |
|---|---|---|
unsigned char | 1 字節 | 0 ~ 255 |
signed char | 1 字節 | -128 ~ +127 |
unsigned int / unsigned short | 2 字節 | 0 ~ 65535 |
signed int / signed short | 2 字節 | -32768 ~ +32767 |
unsigned long | 4 字節 | 0 ~ 4,294,967,295 |
signed long | 4 字節 | -2,147,483,648 ~ +2,147,483,647 |
float / double | 4 字節 | ±1.175e-38 ~ ±3.402e+38 (IEEE-754 單精度) |
* (指針) | 1~3 字節 | 內存地址,視內存模式而定 |
bit | 1 位 | 0 或 1 (C51 擴展,類 Boolean) |
sfr | 1 字節 | 0 ~ 255 (特殊功能寄存器,如 P1、TH0) |
sfr16 | 2 字節 | 0 ~ 65535 (16 位 SFR,如 T0、T1 計數器) |
sbit | 1 位 | 0 或 1 (可位寻址 SFR 或 RAM 位,如 P1_0) |
char 字符類型signed char(有符號),範圍 -128~127。unsigned char 常用於 ASCII 字符或 ≤255 的小整數。int 整型(C51 中等同 short)signed int。long 長整型signed long。float 浮點型bit 位變量 —— C51 獨有神器sfr / sfr16 / sbit —— 硬件直達// 定義 SFR
sfr P1 = 0x90; // P1 口地址
sfr16 T0 = 0x8A; // 16 位定時器 T0 (TH0:TL0)
// 定義 SBIT (基於 SFR 或直接地址)
sbit P1_0 = P1^0; // 推薦:基於已定義 SFR
sbit P1_0 = 0x90^0; // 直接地址
sbit EA = 0xAF; // 中斷總開關 (IE.7)
// 使用
P1 = 0xFF; // 整口操作
P1_0 = 0; // 單位操作(編譯器生成 SETB/CLR 指令,原子、高效)
EA = 1; // 開總中斷
#include <AT89X51.h>
void main(void) {
unsigned int a; // 16 位,最大 65535
unsigned char b; // 8 位,最大 255
while (1) {
// D1 亮:unsigned int 延時
for (a = 0; a < 65535; a++) P1_0 = 0;
P1_0 = 1;
for (a = 0; a < 30000; a++); // 間隔
// D2 亮:unsigned char 延時
for (b = 0; b < 255; b++) P1_1 = 0;
P1_1 = 1;
for (a = 0; a < 30000; a++);
}
}
現象: D1 亮的時間明顯長於 D2,直觀驗證 16 位 vs 8 位循環次數差異。
unsigned char b;
for (b = 0; b < 256; b++) // ❌ 錯誤!b 最大 255,b++ 後變 0,永遠 < 256
; // 死循環
for (b = 0; b < 255; b++) // ✅ 正確
;
同理 unsigned int 不超 65535,signed int 不超 ±32767。
unsigned char 解決(≤255)就不用 int,省 RAM、省周期。bit,極其高效。sfr/sbit,編譯器優化生成位指令。sfr16,避免高低字節分離出錯。float,定點數(Q15/Q31)處理小數運算。熟練掌握 C51 數據類型,是寫出體積小、速度快、穩定可靠單片機代碼的基石。