|
1, 存儲器由若干“字節(jié)”byte單元組成。而每個字節(jié)都有一個地址,當(dāng)然這個地址是物理排序的,怎么說呢?好比就是從0開始刻出的標尺一樣的刻度位置,所以地址是物理固定的;我們說的改變地址,其實改變的不是地址,而是地址里面的內(nèi)容。字節(jié)則是由若干個二進制位bit組成的。而若干個字節(jié)組成一個存儲單元(比如4個字節(jié)可以存儲Int整數(shù)的單元),叫做“字”(word)。在每一個存儲一個數(shù)據(jù)或者一個指令(所謂的32位,64位指令系統(tǒng))。另外,一個字節(jié)由8個二進制位組成,最右邊的一位是“最低位”,最左邊的一位是“最高位”,每個位上的值是0或者1。比如ox10000001表現(xiàn)了這個高位序列。 2, 表示數(shù)值的方法:原碼,反碼和補碼。 1) 原碼。最高位是符號位(0表示正,1表示負),其他各位表示數(shù)值本身的絕對值。注意小譚說,+0和-0表示的不是同一個0,在內(nèi)存中有兩個表示,所以0不適合計算機的運算。有個問題,在我們編程中經(jīng)常用到比較(如:value == 0 )這樣的表達式,經(jīng)過實踐的檢驗是正確可行的,我測試了一下,正0和負0都表示成了同一個值。怎么證明小譚的說法,請大家指點。 2) 反碼。若一個值是正,其反碼和原碼是一樣的;若為負,則符號位為1,其余各位是對原碼取反。 3) 補碼。原碼和反碼不適合計算機內(nèi)運算,因為要單獨處理其符號。補碼規(guī)則:對整數(shù),原碼、反碼、補碼相同;對負數(shù),最高位為1,其余各位取原碼的反,然后對整個數(shù)加1。 4) 總結(jié):這些數(shù)值表示,在我編程過程中從來沒有考慮和體驗過,一定是我太菜的緣故。 3, 位運算。運算量只能是整數(shù)或者字符型,不能為實數(shù)等其他類型。 1) & 按位與:兩個相應(yīng)位都位1,則為1,否則為0。特殊用途 l 清零。找一個數(shù)滿足原來的數(shù)中為1的位在新數(shù)中對應(yīng)0條件即可。 l 取一個數(shù)的指定位。比如高位或者低位,將所取的位對應(yīng)1,其他位對應(yīng)0。 2) |按位或:兩個相應(yīng)位只要有一個為1,該位結(jié)果為1。作用主要是對一個數(shù)據(jù)某些位定位為1。 3) ^ 按位異或:參加運算的兩個相應(yīng)位同號,則為0;異號則為1。注意 l 特定位翻轉(zhuǎn)。構(gòu)造的數(shù)在特定位上取1,其余位取0 l 與0相^,則是保留原值。 l 交換兩個值,不用臨時變量。a = a ^b; b=b^a;a=a^b 4) ~ 取反:對二進制按位取反,注意其優(yōu)先級特別高 5) << 左移:左移一位相當(dāng)于該數(shù)乘以2,兩位乘以4,改規(guī)則只適合在左翼中溢出的被舍棄的高位不含1的情況。 6) >> 右移:就好理解了,但是要注意符號位問題。 l 無符號數(shù),右移在左邊高位移入0。 l 有符號數(shù),整數(shù)的話移入0,負數(shù)的話,移入0或1取決于所用的計算機系統(tǒng)。即移入0為“邏輯右移”,移入1為“算術(shù)右移”。 |
|
|
來自: Ralf_Jones > 《c》