虛擬地址空間
每個(gè)程序被運(yùn)行起來后托修,都將擁有自己的獨(dú)立虛擬地址空間藏古,虛擬地址空間的大小由CPU的位數(shù)決定的吧碾。 比如32位的硬件平臺決定了虛擬地址空間為4GB大小俺孙,對于一個(gè)字長為ω位的機(jī)器,虛擬地址的范圍是 0 到 程序?qū)?nèi)存視為一個(gè)非常大的數(shù)組掷贾,數(shù)組的元素是由一個(gè)個(gè)的字節(jié)組 成睛榄,每個(gè)字節(jié)都由一個(gè)唯一的數(shù)字來表示,我們稱為地址(address)想帅,這些所有的地址的集合就稱為虛擬地址空間(virtual address space)场靴。
字?jǐn)?shù)據(jù)大小
在 64 位的機(jī)器上,可以通過這條命令編譯生 成可以在 32 位機(jī)器上運(yùn)行的程序:
linux> gcc -m32 -o hello32 hello.c
通過修改編譯選項(xiàng)港准,就可以編譯生成在 64 位機(jī)器上運(yùn)行的程序旨剥。
linux> gcc -m64 -o hello64 hello.c
hello32 既可以運(yùn)行在 32 位機(jī)器上,也可以運(yùn)行在 64 位機(jī)器上浅缸,但是 hello64 只能運(yùn)行在64 位的機(jī)器上轨帜。
尋址和字節(jié)順序
- 大端法:最高有效字節(jié)存儲在最前面,也就是低地址處衩椒。一個(gè) int 類型的變量 x(0x01234567)
- 小端法:最低有效字節(jié)存儲在在最前面
大多數(shù) Intel 兼容機(jī)采用小端模式蚌父,IBM 和 Sun 公司的機(jī)器大多數(shù)機(jī)器采用大端法。 對于很多新的處理器毛萌,支持雙端法苟弛,可以配置成大端或者小端運(yùn)行。例如基于 ARM 架構(gòu)的處理器阁将,支持雙端法膏秫,但是 Android 系統(tǒng)和 iOS 系統(tǒng)卻只能運(yùn)行在小端模式
測試代碼:
# include <stdio.h>
typedef unsigned char * byte_pointer;
void show_bytes( byte_pointer start,int len){
int i;
for(i = 0; i < len; i++){ printf(” %.2x” , start[i]);
}
printf(”\n”);
}
void show_int(int x){
show_bytes(( byte pointer) &x,sizeof(×));
}
數(shù)值信息的表示
原碼方法很簡單,但是用原碼表示的數(shù)在計(jì)算機(jī)中進(jìn)行加減法運(yùn)算很麻煩冀痕。比如遇 到兩個(gè)異號數(shù)相加或者兩個(gè)同號數(shù)相減時(shí)荔睹,就要做減法。為了簡化運(yùn)算器的復(fù)雜性言蛇, 提高運(yùn)算速度僻他,需要把減法做成加法運(yùn)算,因此人們引入了反碼和補(bǔ)碼腊尚。
反碼
正數(shù)的反碼與其原碼相同; 負(fù)數(shù)的反碼是在原碼的基礎(chǔ)上保持符號位不變吨拗,其余 各位按位求反得到的。
例如:X=+1010110, [X]反=[X]原=01010110.
Y=-0110101, [Y]原=10110101 [Y]反=11001010. .
補(bǔ)碼
正數(shù)的補(bǔ)碼與其原碼相同; 負(fù)數(shù)的補(bǔ)碼是在原碼的基礎(chǔ)上保持符號位不變婿斥,其它 的數(shù)位 1 變?yōu)?0劝篷,0 變?yōu)?1,最后再加 1 運(yùn)算民宿。也就是說娇妓,負(fù)數(shù)的補(bǔ)碼是它的反碼 加 1。在計(jì)算機(jī)中活鹰,有符號整數(shù)常常用補(bǔ)碼形式存儲5哈恰。
例如:X=+1010110 [X]補(bǔ)=[X]反=[X]原=01010110.
Y=-0110101 [Y]原=10110101 [Y]補(bǔ)=11001011.
對于任意一個(gè)數(shù)它的補(bǔ)碼的補(bǔ)碼是原碼只估,即 [[X]補(bǔ)]補(bǔ)=[X]原.