許多初學者被變數類型繞得暈頭轉向,實則 記憶體中只存二進制位模式,類型僅是編譯器解讀這些位模式的「透鏡」。本文通過三組實驗代碼,直觀展示相同位模式在不同類型、不同輸出格式下的多重面貌,幫你建立「看本質、不看形式」的記憶體思維。
char a = '1'; // ASCII 0x31 → 記憶體存 0x31
int b = 1; // 4 字節存 0x00000001
int c = a; // 擴展賦值:0x31 → 0x00000031
輸出:a=31, b=1, c=31。關鍵點:char 只佔 1 字節,存字元編碼;int 佔 4 字節,存數值的二進制補碼。
char a = 49; // 49(十進制) = 0x31 → 記憶體 0x31
int b = 49; // 記憶體 0x00000031
輸出:a=31, b=31。同樣的數值 49,在 char 與 int 中佔用空間不同,但低位位模式完全一致。
char a = 49; // 0x31
int b = 49; // 0x00000031
printf("a=%x", a); // 31
printf("b=%c", b); // 1 ← 以字元方式解讀 0x31
同一塊記憶體,用 %x 看是十六進制數值,用 %c 看卻成了字元 '1'。資料本身沒變,變的是「解讀透鏡」。
char a = 49; int b = 49; float c = 49.0f;
if (a == b) // true 位模式低位一致
if (a == c) // true float 49.0f 的位模式 0x42480000 低字節恰為 0x00?實測輸出顯示一致,說明編譯器做了隱式轉換比較數值而非位模式
if (b == c) // true 同上
輸出:a=31, b=31, c=49.000000。注意:== 運算子對算術類型執行 數值比較(經過 usual arithmetic conversions),而非逐位比較。若要比較位模式,請用 memcmp 或 std::bit_cast(C++20)。
下次除錯時,試著在監視視窗切換十六進制/浮點數/字元視圖,你會看到同一地址隨觀測方式「變身」——這正是理解 C/C++ 記憶體模型的關鍵一課。