2.1信息存儲(chǔ)
機(jī)器程序?qū)?nèi)存視為一個(gè)很大的字節(jié)數(shù)組,稱為虛擬內(nèi)存肛炮。所有可能的地址集合稱為虛擬地址空間止吐,實(shí)際上宝踪,該功能的實(shí)現(xiàn)是將動(dòng)態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器(DRAM)、閃存碍扔、磁盤存儲(chǔ)器瘩燥、特殊硬件和操作系統(tǒng)軟件結(jié)合起來(lái),使其看上去是一個(gè)統(tǒng)一的字節(jié)數(shù)組不同。
2.1.1十六進(jìn)制
十進(jìn)制轉(zhuǎn)十六進(jìn)制的方法:如果x是2的非負(fù)整數(shù)n次冪厉膀,那么把n表示成i+4j的形式,其中0<=i<=3,當(dāng)i=0時(shí)二拐,x的開頭寫成2^i.后面跟j個(gè)0服鹅。如果沒(méi)什么規(guī)律那就整除取余法
2.1.2字?jǐn)?shù)據(jù)大小
字長(zhǎng)指明了指針數(shù)據(jù)的標(biāo)稱大小,決定了虛擬地址空間的最大大小百新,如一個(gè)字長(zhǎng)為w的機(jī)器企软,虛擬地址的范圍就是0~2^w-1 .程序最多訪問(wèn)2^w個(gè)字節(jié).所以經(jīng)過(guò)計(jì)算,32位的操作系統(tǒng)的內(nèi)存利用的最多只是4G饭望。(這個(gè)問(wèn)題還需要進(jìn)一步的深究仗哨,還沒(méi)有理解透徹)
2.1.3尋址和字節(jié)順序
考慮一個(gè)w位的整數(shù),其位表示為[x(w-1),x(w-2),......x(1),x(0)],其中的x(w-1)是最高有效位杰妓,x(0)表示最低有效位藻治,將這些位轉(zhuǎn)成字節(jié),那么最低有效字節(jié)就是[x(7),x(6)......x(0)]巷挥。在內(nèi)存中桩卵,最低有效位在前的方式稱為小端法,最高有效位在前的方法稱為大端法倍宾。如某個(gè)int的值的十六進(jìn)制是0x01234567的兩種存儲(chǔ)方式如下
2.1.7位級(jí)運(yùn)算
| & ~ ^ :或雏节、與、非高职、異或
2.1.8邏輯運(yùn)算
2.1.9移位運(yùn)算
左移沒(méi)什么好說(shuō)的
右移運(yùn)算分為了邏輯右移和算術(shù)右移
- 邏輯右移:在左端補(bǔ)0
- 算術(shù)右移:在左端步最高有效位的值钩乍,在處理有符號(hào)整數(shù)的時(shí)候非常有用,一般默認(rèn)對(duì)有符號(hào)整數(shù)采用算數(shù)右移怔锌,而對(duì)于無(wú)符號(hào)數(shù)寥粹,必須是邏輯的
相比于C,Java有著更加準(zhǔn)確的定義埃元,算數(shù)右移:>> 邏輯右移>>>
移位的k一般是小于等于字長(zhǎng)的涝涤,如果大于了那一般是經(jīng)過(guò)mod字長(zhǎng)后進(jìn)行移位運(yùn)算
2.2整數(shù)表達(dá)
2.2.1整數(shù)數(shù)據(jù)類型
C語(yǔ)言支持多種整數(shù)數(shù)據(jù)類型,每種數(shù)據(jù)類型都用相應(yīng)的關(guān)鍵字來(lái)確定大小岛杀,而且不同的大小分配的字節(jié)數(shù)根據(jù)編譯為32位還是64未而有所不同阔拳,所以整理出下表,下表中的每種類型所表示的數(shù)據(jù)范圍都是計(jì)算而來(lái)的类嗤,而不是記憶的糊肠。
2.2.1無(wú)符號(hào)數(shù)的編碼
無(wú)符號(hào)數(shù)的編碼的定義(二進(jìn)制轉(zhuǎn)無(wú)符號(hào)數(shù))
無(wú)符號(hào)數(shù)的二進(jìn)制表示有一個(gè)很重要的屬性辨宠,就是每個(gè)介于0~2^w-1之間的數(shù)都有唯一一個(gè)w位的值編碼。雙射的數(shù)學(xué)屬于可以解釋該原理货裹。
2.2.3 補(bǔ)碼編碼
補(bǔ)碼編碼的定義
與我之前的理解有點(diǎn)出入嗤形,所以將示例放在了下面
下圖是一些經(jīng)常引用的特殊的值,以作記錄
關(guān)于以上的數(shù)字泪酱,有以下的注意點(diǎn)
- 補(bǔ)碼范圍的不對(duì)稱
- 最大的無(wú)符號(hào)數(shù)值正好比補(bǔ)碼的最大值的兩倍大一點(diǎn)
2.2.4有符號(hào)數(shù)和無(wú)符號(hào)數(shù)之間的轉(zhuǎn)換
對(duì)大多數(shù)C語(yǔ)言的實(shí)現(xiàn)派殷,規(guī)則一般是數(shù)值可能改變,但是位模式不變墓阀,
所以經(jīng)過(guò)2.1和2.3的轉(zhuǎn)換,補(bǔ)碼轉(zhuǎn)成無(wú)符號(hào)數(shù)的公式如下
經(jīng)過(guò)推導(dǎo)拓轻,無(wú)符號(hào)數(shù)轉(zhuǎn)補(bǔ)碼的公式如下
2.2.5C語(yǔ)言中有符號(hào)位和無(wú)符號(hào)位
一個(gè)有符號(hào)斯撮、一個(gè)無(wú)符號(hào),C語(yǔ)言會(huì)隱式地將有符號(hào)參數(shù)轉(zhuǎn)為無(wú)符號(hào)參數(shù)扶叉,所以在進(jìn)行某些大于或者小于判斷的時(shí)候勿锅,會(huì)有一些非直觀的現(xiàn)象產(chǎn)生。
2.2.6拓展數(shù)字的位表達(dá)
從一個(gè)較小的數(shù)據(jù)類型轉(zhuǎn)為一個(gè)較大的類型枣氧,理論上應(yīng)該保持兩者的相同溢十。所以出現(xiàn)了無(wú)符號(hào)數(shù)的零擴(kuò)展和補(bǔ)碼數(shù)的符號(hào)擴(kuò)展
2.2.7截?cái)鄶?shù)字
- 截?cái)酂o(wú)符號(hào)數(shù)
x截?cái)酁閗位的結(jié)果是xmod2^k。 該原理背后的直覺(jué)是所有被截去的位權(quán)重都是2^i,其中i>=k达吞,所以每一個(gè)權(quán)在取模之后都變成了零张弛,所以推到得到該結(jié)果 - 截?cái)嘌a(bǔ)碼數(shù)值
x截?cái)酁閗位的結(jié)果是U2T(x mod 2^k), 括號(hào)中的含義與上述類似,函數(shù)是為了把最高有效位轉(zhuǎn)成-2^(k-1).
2.3整數(shù)運(yùn)算
2.3.1無(wú)符號(hào)加法
無(wú)符號(hào)的加法存在以下的原理
檢測(cè)無(wú)符號(hào)數(shù)加法中的溢出
對(duì)于x,y 計(jì)算s=x+y酪劫,當(dāng)且僅當(dāng)s<x(或者s<y)時(shí)吞鸭,發(fā)生了溢出。
無(wú)符號(hào)數(shù)求反
對(duì)于滿足0<=x<2^w 的任意x覆糟,其中w位的無(wú)符號(hào)逆元是以下的公式
2.3.2補(bǔ)碼加法
首先原理如下
檢測(cè)補(bǔ)碼加法中的溢出
s=x+y刻剥,當(dāng)且僅當(dāng)x,y大于零但s小于零時(shí)產(chǎn)生了正溢出,而當(dāng)x滩字,y小于零造虏,但x大于零時(shí),產(chǎn)生了負(fù)溢出
2.3.3補(bǔ)碼的非
公式如下麦箍,求補(bǔ)碼非得位級(jí)表示可以用求反后加一的來(lái)快速求得
2.3.4無(wú)符號(hào)乘法
原理如下
2.3.5補(bǔ)碼乘法
2.3.6乘以常數(shù)
- 乘以2的冪
左移一個(gè)數(shù)值等價(jià)于執(zhí)行一個(gè)與2的冪相乘的無(wú)符號(hào)乘法漓藕。 - 歸納
同時(shí)乘以常數(shù)K的表達(dá)可以通過(guò)以下的方法進(jìn)行優(yōu)化,首先内列,將K的二進(jìn)制表達(dá)成一組0和1交替的序列[(0...0)(1...1)(0...0)]
可以用下面兩種不同形式中的一種來(lái)計(jì)算這些位對(duì)乘積的影響:考慮一組從位位置n到位位置m的連續(xù)的1(n>=m)
形式A:(x<<n)+(x<<(n-1))+...(x<<m)
形式B:(x<<(n+1))-(x<<m)
2.3.7除以2的冪
-
除以2的冪的無(wú)符號(hào)除法
除以2的冪的無(wú)符號(hào)除法
-
向下舍入
-
向上舍入(該處符號(hào)有誤)
2.4浮點(diǎn)數(shù)
2.4.1二進(jìn)制小數(shù)
用最基礎(chǔ)的小數(shù)點(diǎn)右邊的權(quán)設(shè)為1/2^i 的方法可以近似的描述二進(jìn)制小數(shù)
2.4.2 IEEE浮點(diǎn)表示
V=(-1)^s* M*2^E
一共三個(gè)字段撵术。符號(hào)位、整數(shù)位和小數(shù)位
情況1:規(guī)格化的值
情況2:非規(guī)格化的值
情況3:特殊值
以上暫時(shí)沒(méi)有理解话瞧,之后再詳細(xì)學(xué)習(xí)