位元組是最小的記憶體定址單元,乙個位元組是由8位二進位制數組成的,而二進位制數是記憶體的最小單元。
字長是記憶體單元的位址的位數,每個字長指向乙個位元組,也就是c++指標中存放的位元組個數。比如32位字長的機器,虛擬位址範圍就是0~2^32-1,(虛擬位址對應的是虛擬記憶體,虛擬記憶體就是乙個抽象的概念,其對應的物理記憶體空間可能在主存,快閃儲存器,磁碟上,但是從虛擬記憶體的角度,都被整合成一塊連續的記憶體,在底層操作時會通過對映的方法對映到具體的物理記憶體當中。每個程序都有4g的虛擬記憶體,但是對應到物理記憶體並不是真的有4g大小的)
移位注意區分算術移位和邏輯移位,通過下圖可以辨別出兩種移位的區別:
c++中負數是由補碼表示的,補碼的生成規則是:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1,即在反碼的基礎上+1。
至於為什麼補碼是這樣的計算方式,可以參考這篇文章:
在c++中有符號數和無符號數之間的強制轉換就是不改變每一位二級制的值,只是計算方式不一樣,有符號數是按補碼計算,無符號數是按原碼來計算的。按這種計算方式,非負數的轉換值不變,但是負數轉換值大概率不是自己想要的了。
int main(void)
//在有符號數的情況下,-149的二進位制表示是1111 1111 1111 1111 1111 1111 0110 1011
//無符號數4294967147的二進位制表示也是上面這個
注意:c++中三種情況下都可能發生這種轉換
/*顯示轉換*/
int a=10;
unsigned int b;
b=(unsigned int)a;
/*隱式轉換1*/
int a=10;
unsigned int b;
b=a;
/*隱式轉換2*/
int a=10;
unsigned int b;
b+a;//如果運算中有無符號數和有符號數,那麼會自動轉換為無符號數進行運算
注意在比較運算時,如下的例子需要注意(其中打*的是特別需要注意的,另外-2147483647-1的無符號數是2147483648)
無符號數 有符號數 與 補碼
本文是深入理解計算機系統這本書裡面關於補碼有符號數無符號數章節的乙個摘要和讀書報告,我個人認為這本書關於這一段的表述,要比絕大多數網上的部落格甚至是國內教材要深入淺出的多.同時由於markdown的文件表示公式很麻煩,本文將大量使用書中的截圖作為公式使用.書中採用乙個函式b2u w binary t...
有符號數與無符號數
關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...
有符號數與補碼
對於unsigned int,其資料範圍為 0,2 32 1 補碼和原碼都是對於有符號數而言的。對於int,0,2 31 1 為正數,2 31,1 為負數。對於負數 x來說,補碼表示實際上為2 n x,其中n為該數的位數,則 x與x相加剛好為0。那麼我們注意到,對於x 0,2 31 1 32位表示,...