計算機用存儲單元存儲數據(編碼後的數據),C語言中用變量標識計算機中的存儲單元。
C語言中有long i,j;i=1;j=-1;,則相應的計算機中就有四個字節的整型變量,其存儲狀態為00000000000000000000000000000001(十六進制形式為00000001)和11111111111111111111111111111111(十六進制形式為ffffffff)。因此,說變量i和變量j的存儲狀態為00000001和ffffffff。因為變量的類型已經固定,所以它們的實際值也是固定的。
計算機采用二進制,整數、小數或字符編碼後的數據都是01串,不同類型的數據可能對應於同一個編碼,因此,計算機中的存儲狀態究竟代表什麼數據不能確定,只有確定了類型才能確定值。
C語言中i+j,從字面意思上理解為1+-1值為0。計算機中實際的執行過程卻是00000001+ffffffff得到00000000,結果為整數0的編碼。
在查看變量的輸出結果時,printf函數可以將相關數據的存儲狀態解碼成“整數”呈現給用戶,printf解碼出的數據就是輸出值。printf函數不會考慮相關變量的類型只根據自己的格式字符來解碼數據,因此,用printf函數輸出的變量的值不一定就是變量的實際值。如語句printf("%ld,%lu\n“,j,j);的輸出結果為-1,4294967295。
總結起來,變量的存儲狀態固定,實際值固定,輸出值可能有多個。
可以用printf函數輸出整型數據的存儲狀態。格式字符o以八進制形式輸出整型數據的存儲狀態,而格式字符X(x)可以十六進制形式的輸出存儲狀態。(通常大家對這兩個格式字符的作用有誤解。)
浮點型數據的存儲狀態比較復雜,通常不輸出也不分析。
浮點型變量的實際值通常非常長,且有些是無效數字,因此容易被人忽略。浮點型變量的實際值與程序中賦的原始值多數情況下有誤差,強調它的實際值意義重大。用printf函數輸出讓浮點型數據的許多位(如20位),在輸出數據中最後的數字將全是0,因此,除去最後的0前面的數據就可以認為是浮點型數據的實際值。如有float fa = 0.1; double fb = 0.1; printf("%.20f,%.20f\n", fa, fb);,則程序的輸出(VC6.0)為0.10000000149011612000,0.10000000000000001000,因此,變量fa的原始值為0.1,實際值為0.10000000149011612;變量fb的原始值為0.1,實際值為0.10000000000000001。
浮點型數據的輸出值,多為實際值保留小數點後幾位小數的結果。
整型變量的原始值和實際值也會出現誤差,如有short j=50000;則變量j的原始值為50000,實際值肯定不會是50000(它的實際值最大只能是32767)。
分清這幾個概念的含義對於正確使用變量意義重大。程序中變量的運算都是基於(存儲狀態)實際值的。