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

變量的四重面孔:原始值、存儲狀態、實際值與輸出值深度解析

     編輯:關於C語言

四大概念辨析

概念定義特點例子
原始值源代碼中字面賦予的值程序員意圖,編譯時可見float f = 0.1; → 0.1
存儲狀態內存中實際的位模式(0/1序列)與類型無關,純二進制0x3DCCCCCD (float 0.1)
實際值按類型解釋存儲狀態得到的語義值類型固定則值固定,可能含誤差0.10000000149011612
輸出值printf 等按格式字符解碼顯示的值取決於格式字符,可多樣化%f→0.100000 %x→3DCCCCCD

整型變量:存儲狀態 = 實際值(無誤差)

long i = 1, j = -1;
// 存儲狀態(32位):
// i: 00000000 00000000 00000000 00000001 (0x00000001)
// j: 11111111 11111111 11111111 11111111 (0xFFFFFFFF)
// 實際值:1, -1
// 輸出:printf("%ld %lu", j, j) → -1, 4294967295 (格式不同,解碼不同)

關鍵:printf 不檢查類型,只按格式字符強行解碼存儲狀態。

浮點型:實際值 ≠ 原始值(精度誤差)

float fa = 0.1f;
double fb = 0.1;
printf("%.20f, %.20f\n", fa, fb);
// 輸出:0.10000000149011612000, 0.10000000000000001000
// 實際值:fa≈0.10000000149, fb≈0.10000000000000001
// 原始值均為 0.1,但二進制無法精確表示 0.1

去除末尾補零後的數字即為實際值。float 約 7 位有效數字,double 約 15 位。

整型溢出:原始值 ≠ 實際值

short s = 50000;  // short 範圍 -32768~32767
// 原始值 50000,實際值實現定義(通常模 65536 → -15536)

存儲狀態輸出技巧

  • %x / %X:十六進制輸出存儲狀態(無符號解釋)。
  • %o:八進制輸出存儲狀態。
  • 浮點存儲狀態較複雜(符號位+指數+尾數),通常不直接輸出分析。

核心結論

  1. 存儲狀態固定 → 實際值固定(給定類型)。
  2. 輸出值可變(取決於格式字符)。
  3. 程序運算基於實際值(即存儲狀態按類型解釋)進行。
  4. 理解四者關係,能避免「printf 輸出不符預期」等困惑,是精通 C 語言類型系統的基石。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved