理解資料在記憶體中的表示是C語言程式設計的基石。本文深入剖析整數、浮點數與字符類型的存儲機制、範圍差異及常見陷阱。
整數無小數部分,以二進制補碼形式存儲。例如 7 在 8 位元組中為 00000111。關鍵點:
int 通常佔 4 位元組(32 位系統),範圍 -2^31 ~ 2^31-1。unsigned int 範圍 0 ~ 2^32-1,無負數,減法溢位環繞。%d 十進制,%o 八進制,%x 十六進制,加 # 顯示前綴(0, 0x)。int x = 100;
printf("dec=%d octal=%o hex=%x\n", x, x, x); // 100 144 64
printf("dec=%d octal=%#o hex=%#x\n", x, x, x); // 100 0144 0x64
int i = 2147483647; // INT_MAX
unsigned int j = 4294967295; // UINT_MAX
printf("%d, %d, %d\n", i, i+1, i+2); // 2147483647, -2147483648, -2147483647
printf("%u, %u, %u\n", j, j+1, j+2); // 4294967295, 0, 1
有號溢位為未定義行為(實際多為環繞),無號溢位定義為模 2^n 環繞。
char 的雙重身份char 本質是 1 位元組整數(通常 8 位),用 ASCII 碼映射字符:
char c = 'A'; 等價於 char c = 65;。'ABCD' 將 4 個 ASCII 碼壓入 32 位整數,賦值給 char 時截取低 8 位(結果為 'D')。char grade = 'A';
char grade1 = 65;
char testChar = 'ABCD';
printf("%c, %c, %c\n", grade, grade1, testChar); // A A D
float 約 7 位有效數字,double 約 15-16 位)。<inttypes.h>使用 int16_t, int32_t 等跨平台類型,配合 PRId16 等格式宏輸出,增強可移植性。
#include <inttypes.h>
int16_t me16 = 4593;
printf("me16=%hd size=%zd\n", me16, sizeof(int16_t));