在內存中,有符號整數採用補碼形式存儲:
補碼設計巧妙地統一了加減法運算,並解決了“正零/負零”問題(只有全 0 一種零),擴展了負數表示範圍。無符號數最大值約為有符號數最大值的 2 倍 + 1。C 語言中浮點型(float/double)均為有符號,不支持無符號修飾。
| 類型 | 長度 |
|---|---|
| char | 1B |
| short | 2B |
| int | 4B |
| long | 4B |
| float | 4B |
| double | 8B |
| long long | 8B |
註:具體長度取決於編譯器與目標平台(如 LP64 vs LLP64 模型),以上為 32/64 位常見環境典型值。
字符在內存中以對應的 ASCII 碼(或擴展編碼)形式存放。例如 'A' 存儲為 65 (0x41)。
printf("Y\b=\n");
利用控制字符 \b(退格)使打印頭回退一格,將 = 覆蓋在 Y 上形成 ¥ 效果。僅適用於打印機等支持重疊打印的設備,現代終端/顯示器通常不支持此視覺效果。
顯式轉換(強制類型轉換)或隱式轉換僅產生一個臨時值,不改變原變量的類型或內存內容。
格式字符串結構:%[標誌][寬度][.精度][長度]類型
- 左對齊, 0 填充, + 強制符號, 空格 正數前空格, # 替代形式。*(由參數指定)。hh, h, l, ll, j, z, t, L 等。關鍵誤區:輸出精度主要取決於機器內部存儲精度,而非格式串指定的寬度/精度。例如float通常僅有 6~7 位有效數字,強行指定%.20f後面的數字毫無意義。
int a = 1, b = 2;
printf("x = %d, y = %d\n", ++a + b, ++b + a);
輸出 x = 5, y = 4(假設右到左求值)。
C 標準規定:函數參數的求值順序是未指定的(Unspecified Behavior),因編譯器而異。嚴禁在參數列表中對同一變量進行修改並依賴特定順序,應預先計算好傳入定值。
輸入並非即時逐項讀取,而是行緩衝:用戶輸入一行並按 Enter 後,數據先存入 stdin 緩衝區,scanf 再按格式從中解析。
scanf 使用。"%d %c %c")可跳過空白字符,提高健壯性。%3c),嚴格按字符數讀取,不跳過空白。getchar() 同樣基於行緩衝:鍵盤輸入放入緩衝區,按 Enter 後才逐字符讀取。這解釋了為什麼無法實現“按鍵即響應”的交互(需平台特定 API 如 getch 或終端原始模式)。
