| 概念 | 定義 | 特點 | 例子 |
|---|---|---|---|
| 原始值 | 源代碼中字面賦予的值 | 程序員意圖,編譯時可見 | 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:八進制輸出存儲狀態。