直奔主題,先上一道例題,大家思考一下,為什么答案是這個樣子!
下面是linux系統(tǒng)的輸出結(jié)果:
(1)幾點基礎(chǔ)注意
變量定義:是在內(nèi)存中確定變量的位置和大小,即:定義時分配內(nèi)存。例如:int a;
賦值:是在擦除對象當前值,并用新的值代替。例如:a = 2;
初始化:先分配內(nèi)存,再進行賦值操作。
(2)原碼、反碼、補碼
機器數(shù):一個數(shù)在計算機中是以二進制形式存儲的,這個數(shù)就是機器數(shù)。機器數(shù)的高位是符號位,正數(shù)為0,負數(shù)為1。
真值:除了符號位,其余位對應的值是真值。
例如:1000 0001 真值是-1,不是129。
原碼:符號位加上真值的絕對值。
例如:[+1]原碼:0000 0001,[-1]原碼:1000 0001
反碼:正數(shù)的反碼是其本身,負數(shù)的反碼是在原碼的基礎(chǔ)上,符號位不變,其余為取反。
例如:[+1]反碼:0000 0001,[-1]反碼:1111 1110
補碼:正數(shù)的補碼是其本身,負數(shù)的補碼是其反碼加1。
例如:[+1]補碼:0000 0001,[-1]補碼:1111 1111
整型數(shù)據(jù)在內(nèi)存中是以補碼的形式存儲的。要得到負數(shù)的真值需要得到原碼。補碼的補碼就是其原碼。
(3)%d和%x
%d:是有符號位輸出,那么首先看補碼的符號位,是正是負;是正,補碼就是原碼;是負,補碼的補碼才是原碼,也才是輸出結(jié)果。
%x:是16進制數(shù)輸出,輸出時是4字節(jié),32位。如果不夠4字節(jié)要進行擴展,并且高位全部用符號位來填充。
(4)分析計算
char a = 247;
系統(tǒng)分配1個字節(jié)內(nèi)存大小,里面存儲正數(shù)247的補碼,即:1111 0111(正數(shù)的補碼就是原碼)。
%d輸出:首先看高位,變量a是char類型,8位,高位是1,代表是負數(shù),現(xiàn)在內(nèi)存中存儲的是其補碼,要得到輸出的原碼,需要得到現(xiàn)在補碼的補碼(補碼的補碼是原碼),即: 1111 0111 ------ 反碼:1000 1000 ------ 補碼:1000 1001,此時的補碼就是真正的原碼:-9,所以輸出結(jié)果就是-9。
%x輸出:現(xiàn)在存儲的是:1111 0111,即:0xf7,要注意%x是4字節(jié)輸出,此時是char類型,輸出時要進行默認轉(zhuǎn)換,轉(zhuǎn)換成32位,并且高位全部用符號位填充,即:1111 1111 1111 1111 1111 1111 1111 0111,是0xff ff ff f7。