首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows Native 開發基礎(二):C 語言常量、變量與基本資料類型深度解析

     編輯:關於C語言

Windows Native 開發基礎(二):C 語言常量、變量與基本資料類型深度解析

承接上一篇「Hello C」,本文深入剖析 C 語言的常量、變量聲明定義區別、基本資料類型在 32 位系統上的佈局、隱式/顯式轉換規則、溢位行為、字元編碼與字串結構,配合可編譯運行的範例代碼。

變量聲明 vs 定義:核心區別

  • 聲明:告訴編譯器「有這個符號、類型是什麼」,不分配記憶體(extern int x;)
  • 定義:分配記憶體,可選擇性初始化(int x = 100;)
  • 定義即聲明,但聲明不一定是定義
  • 未初始化的區域變量值不可預測,嚴禁使用

常量三種形式

形式語法特點範例
字面常量直接書寫類型由字面值推導100, 3.14, 'A', "str"
宏常量#define NAME value預處理器文本替換,無類型、無作用域、不分配記憶體#define PI 3.14
const 常量const type name = value;有類型、有作用域、分配記憶體(只讀區),編譯期可優化const int MAX = 100;

關鍵差異:#define X 1+2 在 3*X*4 中展開為 3*1+2*4=11;const int X=1+2 則為 3*3*4=36。宏每次引用重新展開,const 僅定義時求值一次。

32 位系統基本類型佈局

類型大小範圍/精度字面值後綴
int4 bytes-2,147,483,648 ~ 2,147,483,647無 / L (long)
short2 bytes-32,768 ~ 32,767無
long4 bytes (Windows) / 8 bytes (Linux 64)同 int 或更大L / l
unsigned int4 bytes0 ~ 4,294,967,295U / u
unsigned long4/8 bytes0 ~ ULONG_MAXUL / ul
float4 bytes~7 有效位數F / f
double8 bytes~15 有效位數無 / F / f
long double16 bytes (x87) / 8 bytes (其他)~19 有效位數L / l

進制字面值與溢位演示

int oct = 015;      // 八進制 -> 13
int hex = 0xFFFF;   // 十六進制 -> 65535

short s = 32767;    // 0x7FFF
s++;                // 變為 -32768 (0x8000),有符號溢位:最高位變號位
// 無符號溢位:模 2^N 環繞,C 標準保證定義行為

浮點數內部表示(IEEE 754)

S = M × 2^E,二進制科學記數法:

  • float (32位):1 位符號 + 8 位指數 (偏移 127) + 23 位尾數(隱含首位 1,實際 24 位精度)
  • double (64位):1 位符號 + 11 位指數 (偏移 1023) + 52 位尾數(實際 53 位精度)
float x = 0.00314E3;  // 3.14
float y = 314E-2;     // 3.14

字元與字串本質

類型轉換規則速查

  1. 整數提升:char/short/_Bool → int(或 unsigned int)
  2. 常用算術轉換:雙運算元統一到「較高」類型(long double > double > float > unsigned long > long > unsigned > int)
  3. 賦值轉換:右值隱式轉換為左值類型,可能截斷/擴展
  4. 強制轉換:(type)expr,明確意圖,但仍可能丟失資訊

工程建議

  • 優先使用 stdint.h 定寬類型(int32_t, uint16_t)而非基本類型
  • 常量首選 const,宏僅用於條件編譯/字串化/連接操作
  • 浮點數比較用 fabs(a-b) < epsilon,勿用 ==
  • 字串處理用 strncpy/snprintf,禁用 strcpy/sprintf
  • 啟用編譯器警告(-Wall -Wextra -Wconversion)捕捉隱式轉換問題

扎實掌握類型系統,是寫出可移植、無未定義行為、高效能 C 代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
概念本質範例
字元常量單引號,對應 ASCII/Unicode 碼值'A' (65), '\n' (10)
轉義序列反斜槓開頭,單字元\r\n\t\b\\\'\"\0
八進制字元\ooo (1-3 位八進制)\101 -> 'A'
十六進制字元\xhh (1-2 位十六進制)\x41 -> 'A'
字串常量雙引號,字元陣列 + 隱含結束符 \0"abc" 佔 4 bytes: 'a','b','c','\0'