一逼纸、計(jì)算機(jī)系統(tǒng)漫游
1.1 信息就是位+上下文
位/比特:0和1
字節(jié):8位一組
系統(tǒng)上所有信息(磁盤文件、內(nèi)存中的程序、內(nèi)存的數(shù)據(jù)、網(wǎng)絡(luò)傳送的數(shù)據(jù))都是一串比特表示耐量。根據(jù)數(shù)據(jù)對(duì)象的上下文區(qū)分不同數(shù)據(jù)裹芝。
1.2 程序被其他程序翻譯成不同的格式
源文件—編譯器驅(qū)動(dòng)程序—>目標(biāo)文件
預(yù)處理階段:cpp根據(jù)#開頭的命令修改原始的C程序坝橡。
編譯階段:col翻譯成匯編語(yǔ)言程序方仿。
匯編階段:as翻譯位機(jī)器語(yǔ)言指令,打包指令成可重定位目標(biāo)程序藏澳。
鏈接階段:負(fù)責(zé)合并標(biāo)準(zhǔn)C庫(kù)等單獨(dú)預(yù)編譯好的目標(biāo)文件仁锯,得到可執(zhí)行目標(biāo)文件。
1.3 了解編譯系統(tǒng)如何工作是大有益處的
1.4 處理器讀并解釋儲(chǔ)存在內(nèi)存中的指令
shell命令行解釋器翔悠,若輸入第一個(gè)單詞不是內(nèi)置shell命令則加載這個(gè)文件业崖。
1.4.1 系統(tǒng)的硬件組成
總線
貫穿整個(gè)系統(tǒng)的電子管道野芒。
攜帶信息自己并在各個(gè)部件中傳遞。傳送定長(zhǎng)的字節(jié)塊(字腻要,字長(zhǎng)是字中的字節(jié)數(shù))
I/O設(shè)備
輸入:鍵盤复罐、鼠標(biāo)
輸出:顯示器、磁盤驅(qū)動(dòng)器(即磁盤)
I/O設(shè)備通過(guò)控制器(I/O設(shè)備本身或系統(tǒng)主板上的芯片)/適配器(主板插槽上的卡)與總線相連雄家。傳遞I/O總線和I/O設(shè)備之間的信息。
主存
臨時(shí)存儲(chǔ)設(shè)備胀滚,處理器執(zhí)行程序時(shí)用來(lái)存放程序和程序處理的數(shù)據(jù)趟济。
物理上,一組動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)芯片組成咽笼。
邏輯上顷编,線性的字節(jié)數(shù)組,每個(gè)字節(jié)有唯一的從0開始的地址(數(shù)組索引)剑刑。
處理器
中央處理單元(CPU)媳纬,解釋(或執(zhí)行)存儲(chǔ)在主存中指令的引擎。
核心:大小為一個(gè)字的存儲(chǔ)設(shè)備(或寄存器)施掏,稱為程序計(jì)數(shù)器(PC)钮惠。任何時(shí)候,PC都指向主存中某條機(jī)器語(yǔ)言指令(含有該指令的地址)
處理器從系統(tǒng)通電到斷電七芭,一直執(zhí)行PC指向的指令素挽,再更新PC,使其指向下一條指令(不一定是相鄰指令)狸驳。
寄存器文件:存儲(chǔ)設(shè)備预明,由一些單個(gè)字長(zhǎng)的寄存器組成
算術(shù)/邏輯單元ALU:計(jì)算新的數(shù)據(jù)和地址值
注:
指令集架構(gòu):描述每條機(jī)器代碼指令的效果。
微體系結(jié)構(gòu):描述處理器實(shí)際上如何實(shí)現(xiàn)耙箍。
1.4.2 運(yùn)行hello程序
在鍵盤輸入字符串撰糠,shell將字符逐一讀入寄存器并存放到內(nèi)存。
在鍵盤敲回車鍵辩昆,shell執(zhí)行一系列指令加載文件阅酪,指令將目標(biāo)文件代碼和數(shù)據(jù)從磁盤復(fù)制到主存。利用直接存儲(chǔ)器存取DMA卤材,數(shù)據(jù)可不通過(guò)處理器而直接從磁盤到達(dá)主存遮斥。
加載到主存后處理器執(zhí)行程序main程序中的機(jī)器語(yǔ)言指令。將字節(jié)從主存復(fù)制到寄存器文件扇丛,從寄存器文件復(fù)制到顯示設(shè)備术吗,最終到達(dá)屏幕。
1.5 高速緩存至關(guān)重要
高速緩存存儲(chǔ)器cache:更小更快的存儲(chǔ)設(shè)備帆精,存放處理器近期可能會(huì)需要的信息较屿。
L1隧魄、L2高速緩存用靜態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器SRAM實(shí)現(xiàn)。
系統(tǒng)甚至有三級(jí)高速緩存L1隘蝎、L2购啄、L3,利用高速緩存的局部性原理嘱么,即程序具有訪問(wèn)局部區(qū)域里的數(shù)據(jù)和代碼趨勢(shì)狮含。
1.6 存儲(chǔ)設(shè)備形成層次結(jié)構(gòu)
上一層是下一層的高速緩存。
1.7 操作系統(tǒng)管理硬件
操作系統(tǒng)是應(yīng)用程序域硬件之間的一層軟件曼振。
操作系統(tǒng)功能
防止硬件被失控的應(yīng)用程序?yàn)E用
向應(yīng)用程序提供簡(jiǎn)單一致的機(jī)制來(lái)控制復(fù)雜又不大相同的低級(jí)硬件設(shè)備几迄。
抽象表示
文件 = I/O設(shè)備
虛擬內(nèi)存 = 主存 + 磁盤I/O設(shè)備
進(jìn)程 = 處理器 + 主存 + I/O設(shè)備
1.7.1 進(jìn)程
進(jìn)程是操作系統(tǒng)對(duì)一個(gè)正在運(yùn)行的程序的一種抽象,系統(tǒng)上可同時(shí)運(yùn)行多個(gè)進(jìn)程冰评,而每個(gè)進(jìn)程都好像獨(dú)占硬件映胁。
并發(fā)運(yùn)行:一個(gè)進(jìn)程的指令和另一個(gè)進(jìn)程的指令交錯(cuò)執(zhí)行。
上下文切換:實(shí)現(xiàn)交錯(cuò)執(zhí)行的機(jī)制甲雅。
上下文:進(jìn)程運(yùn)行所需的所有狀態(tài)信息解孙。
內(nèi)核:操作系統(tǒng)常駐主存部分。不是一個(gè)獨(dú)立的進(jìn)程抛人。是系統(tǒng)管理全部進(jìn)銷存所有的代碼和數(shù)據(jù)機(jī)構(gòu)的集合弛姜。
一個(gè)進(jìn)程到另一個(gè)進(jìn)程的轉(zhuǎn)換是由內(nèi)核管理。
如:讀寫文件函匕,執(zhí)行系統(tǒng)調(diào)用指令娱据,控制權(quán)傳遞給內(nèi)核,內(nèi)核執(zhí)行被請(qǐng)求的操作并返回應(yīng)用程序盅惜。
1.7.2 線程
一個(gè)進(jìn)程由多個(gè)稱為線程的執(zhí)行單元組成中剩。
每個(gè)線程都運(yùn)行在進(jìn)程的上下文中,共享同樣的代碼和全局?jǐn)?shù)據(jù)抒寂。
1.7.3 虛擬內(nèi)存
為每個(gè)進(jìn)程提供假象结啼,即每個(gè)進(jìn)程都在獨(dú)占使用主存。
虛擬地址空間:每個(gè)進(jìn)程看到一樣的內(nèi)存屈芜。
從低到高地址依次為:
程序代碼和數(shù)據(jù)
對(duì)所有進(jìn)程來(lái)說(shuō)郊愧,代碼從同一固定地址開始,接著C全局變量相對(duì)應(yīng)的數(shù)據(jù)位置井佑。代碼和數(shù)據(jù)區(qū)是之間按可執(zhí)行文件內(nèi)容初始化属铁。指定大小。
堆
運(yùn)行時(shí)動(dòng)態(tài)擴(kuò)展(malloc)或收縮(free)躬翁。
共享庫(kù)
存放像C標(biāo)準(zhǔn)庫(kù)和數(shù)學(xué)庫(kù)等共享庫(kù)的代碼和數(shù)據(jù)的區(qū)域焦蘑。
棧
位于用戶虛擬地址空間頂部的是用戶棧,實(shí)現(xiàn)函數(shù)調(diào)用盒发。程序執(zhí)行期間可動(dòng)態(tài)擴(kuò)展(調(diào)用函數(shù))或收縮(函數(shù)返回)例嘱。
內(nèi)核虛擬內(nèi)存
地址空間頂部狡逢。不允許應(yīng)用程序讀寫或調(diào)用。必須調(diào)用內(nèi)核來(lái)執(zhí)行操作拼卵。把一個(gè)進(jìn)程虛擬內(nèi)存的內(nèi)容存儲(chǔ)到磁盤上奢浑,然后用主存作為磁盤的高速緩存。
1.7.4 文件
字節(jié)序列腋腮。
每個(gè)I/O設(shè)備都可看成是文件雀彼。
1.8 系統(tǒng)之間利用網(wǎng)絡(luò)通信
網(wǎng)絡(luò)可視為一個(gè)I/O設(shè)備。
系統(tǒng)從主存復(fù)雜一串字節(jié)到網(wǎng)絡(luò)適配器時(shí)低葫,數(shù)據(jù)流經(jīng)過(guò)網(wǎng)絡(luò)到達(dá)另一臺(tái)機(jī)器详羡。系統(tǒng)讀取從其他機(jī)器發(fā)送來(lái)的數(shù)據(jù)并把數(shù)據(jù)復(fù)制到自己的主存。
1.9 重要主題
系統(tǒng)是硬件和軟件互相交織的集合體嘿悬,共同協(xié)作達(dá)到運(yùn)行應(yīng)用程序的最終目的。
1.9.1 Amdahl定律
對(duì)系統(tǒng)某個(gè)部分加速時(shí)水泉,對(duì)系統(tǒng)整體性能的影響取決于該部分的重要性和加速程度善涨。
1.9.2 并發(fā)和并行
并發(fā):一個(gè)同時(shí)具有多個(gè)活動(dòng)的系統(tǒng)。
并行:用并發(fā)來(lái)使一個(gè)系統(tǒng)運(yùn)行得更快草则。
線程級(jí)并發(fā)
構(gòu)建在進(jìn)程抽象上钢拧,設(shè)計(jì)出同時(shí)有多個(gè)程序執(zhí)行的系統(tǒng)。
傳統(tǒng)上炕横,通過(guò)計(jì)算機(jī)在執(zhí)行進(jìn)程間快速切換來(lái)實(shí)現(xiàn)源内。
多核處理器
將多個(gè)CPU集成到一個(gè)集成電路芯片上。
超線程(同時(shí)多線程)
允許一個(gè)CPU執(zhí)行多個(gè)控制流的技術(shù)份殿。
設(shè)計(jì)CPU某些硬件有多個(gè)備份膜钓。
指令級(jí)并行
現(xiàn)代處理器可同時(shí)執(zhí)行多條指令的屬性。
超標(biāo)量處理器:一個(gè)周期一條指令更快的執(zhí)行速率的處理器
單指令卿嘲、多數(shù)據(jù)并行
允許一條指令產(chǎn)生多個(gè)可以并行執(zhí)行的操作颂斜,即SIMD并行。
1.9.3 計(jì)算機(jī)系統(tǒng)中抽象的重要性
虛擬機(jī) = 整個(gè)計(jì)算機(jī)的抽象 = 操作系統(tǒng) + 處理器 + 程序
1.10 小結(jié)
第一部分:程序結(jié)構(gòu)和執(zhí)行
二拾枣、信息的表示和處理
2.1 信息存儲(chǔ)
虛擬內(nèi)存:機(jī)器級(jí)程序?qū)?nèi)存視為一個(gè)很大的字節(jié)數(shù)組
地址:內(nèi)存中每個(gè)字節(jié)由一個(gè)唯一的數(shù)字標(biāo)識(shí)
虛擬地址空間:所有可能地址的集合沃疮,只是一個(gè)展示給機(jī)器級(jí)程序的概念性映像
2.1.1 十六進(jìn)制表示法
十六進(jìn)制與二進(jìn)制互轉(zhuǎn)
十進(jìn)制與十六進(jìn)制轉(zhuǎn)換
2.1.2 字?jǐn)?shù)據(jù)大小
每臺(tái)計(jì)算機(jī)都有一個(gè)字長(zhǎng),指明指針數(shù)據(jù)的標(biāo)稱大小梅肤。
對(duì)于一個(gè)字長(zhǎng)為w位機(jī)器而言司蔬,虛擬地址范圍0~2^w-1,程序最多訪問(wèn)2^w個(gè)字節(jié)姨蝴。
大多數(shù)64位機(jī)器也可以運(yùn)行為32位機(jī)器編譯的程序俊啼,向后兼容。
“32位”或“64位”程序的區(qū)別是如何編譯的似扔,而不是運(yùn)行的機(jī)器類型吨些。
有些數(shù)據(jù)類型的確切字節(jié)數(shù)依賴于程序是如何被編譯的搓谆。
大部分?jǐn)?shù)據(jù)類型編碼位有符號(hào)數(shù)值。
2.1.3 尋址和字節(jié)順序
對(duì)于跨越多字節(jié)的程序?qū)ο蠛朗瑑蓚€(gè)規(guī)則:
這個(gè)對(duì)象的地址是什么(一般是所使用字節(jié)中最小的地址)
在內(nèi)存中如何排列這些字節(jié)(一般被存儲(chǔ)位連續(xù)的字節(jié)序列)
排列表示一個(gè)對(duì)象的字節(jié)兩個(gè)規(guī)則:
小端法:在內(nèi)存中按照從最低有效字節(jié)到最高有效字節(jié)的順序存儲(chǔ)對(duì)象泉手,最低有效字節(jié)在前面
大端法:在內(nèi)存中按照從最高有效字節(jié)到最底有效字節(jié)的順序存儲(chǔ)對(duì)象,最高有效字節(jié)在前面
2.1.4 表示字符串
C語(yǔ)言字符串被編碼為一個(gè)以null(其值為0)字符結(jié)尾的字符數(shù)組偶器。每個(gè)字符都有某個(gè)標(biāo)準(zhǔn)編碼表示斩萌,最常見的是ASCII字符碼。
ASCII作為字符碼在任何系統(tǒng)上都得到相同的結(jié)果屏轰,與字節(jié)順序和字大小規(guī)則無(wú)關(guān)颊郎。因此,文本數(shù)據(jù)比二進(jìn)制數(shù)據(jù)有更強(qiáng)的平臺(tái)獨(dú)立性霎苗。
Java使用Unicode表示字符串姆吭。
2.1.5 表示代碼
二進(jìn)制代碼不兼容。
2.1.6 布爾代數(shù)簡(jiǎn)介
1 == TRUE
0 == FALSE
擴(kuò)展到位向量運(yùn)算唁盏。位向量是固定長(zhǎng)度為w内狸,由0和1組成的串。
布爾環(huán)
用位向量對(duì)集合編碼
(注:集合中元素表示位向量中為1的位置)
2.1.7 C語(yǔ)言中的位級(jí)運(yùn)算
確定一個(gè)位級(jí)表達(dá)式方法:十六進(jìn)制轉(zhuǎn)成二進(jìn)制厘擂,執(zhí)行二進(jìn)制運(yùn)算昆淡,再轉(zhuǎn)回十六進(jìn)制。
常用于掩碼運(yùn)算刽严,掩碼是一個(gè)位模式昂灵,表示從一個(gè)字中選出的位的集合。
2.1.8 C語(yǔ)言中的邏輯運(yùn)算
邏輯運(yùn)算中舞萄,所有非0的參數(shù)都為TRUE眨补,參數(shù)0為FALSE;返回1或0鹏氧,表示TRUE或FALSE渤涌。
若對(duì)第一個(gè)參數(shù)求值就能確定表達(dá)式結(jié)果,就不會(huì)對(duì)第二個(gè)參數(shù)求值把还。
2.1.9 C語(yǔ)言中的移位運(yùn)算
左移運(yùn)算
x<<k :x向左移動(dòng)k位实蓬,丟棄最高的k位,并在右邊補(bǔ)k個(gè)0吊履;
右移運(yùn)算
x>>k :
邏輯右移:左端補(bǔ)k個(gè)0
算術(shù)右移:左端補(bǔ)k個(gè)最高有效位的值
C中無(wú)規(guī)定對(duì)有符號(hào)數(shù)使用哪種類型的右移安皱。
實(shí)際上,幾乎所有編譯器/機(jī)器組合都對(duì)有符號(hào)數(shù)使用算術(shù)右移艇炎。
對(duì)于無(wú)符號(hào)數(shù)酌伊,必須是邏輯右移。
JAVA規(guī)定,x>>k是算術(shù)右移居砖,x>>>k是邏輯右移虹脯。
加減法的優(yōu)先級(jí)高于移位運(yùn)算
2.2 整數(shù)表示
術(shù)語(yǔ)
B:二進(jìn)制 T:補(bǔ)碼 U:無(wú)符號(hào)數(shù)
2.2.1 整型數(shù)據(jù)類型
C支持多種整型數(shù)據(jù)類型——表示有限范圍的整數(shù)。
負(fù)數(shù)范圍比整數(shù)的范圍大1奏候。
注:C和C++都支持有符號(hào)(默認(rèn))和無(wú)符號(hào)數(shù)循集。JAVA只支持有符號(hào)數(shù)。
2.2.2 無(wú)符號(hào)數(shù)的編碼
無(wú)符號(hào)數(shù)編碼有唯一性
2.2.3 補(bǔ)碼編碼
最常見的有符號(hào)數(shù)的計(jì)算機(jī)表示是補(bǔ)碼形式蔗草。
補(bǔ)碼編碼有唯一性
注:Java要求采用補(bǔ)碼表示咒彤。單字節(jié)數(shù)據(jù)稱為byte,而不是char咒精。
有符號(hào)位的其他表示方法
反碼
原碼
2.2.4 有符號(hào)數(shù)和無(wú)符號(hào)數(shù)之間的轉(zhuǎn)換
大多數(shù)C語(yǔ)言的實(shí)現(xiàn)镶柱,是從位級(jí)角度來(lái)看的,而不是數(shù)的角度模叙。
強(qiáng)制轉(zhuǎn)換的結(jié)果保持位置不變歇拆,只是改變了解釋這些位的方式。
B:二進(jìn)制 T:補(bǔ)碼 U:無(wú)符號(hào)數(shù)
補(bǔ)碼轉(zhuǎn)無(wú)符號(hào)數(shù)函數(shù) = 先將補(bǔ)碼轉(zhuǎn)成二進(jìn)制數(shù)范咨,在將二進(jìn)制數(shù)轉(zhuǎn)成無(wú)符號(hào)數(shù)
無(wú)符號(hào)數(shù)轉(zhuǎn)補(bǔ)碼函數(shù) = 先將無(wú)符號(hào)數(shù)轉(zhuǎn)成二進(jìn)制數(shù)查吊,在將二進(jìn)制數(shù)轉(zhuǎn)成補(bǔ)碼
T2U函數(shù)屬性
U2T函數(shù)屬性
總結(jié)
2.2.5 C語(yǔ)言中的有符號(hào)數(shù)與無(wú)符號(hào)數(shù)
默認(rèn)是有符號(hào)數(shù),創(chuàng)建無(wú)符號(hào)常量必須加上后綴字符‘u’或‘U’湖蜕。
允許無(wú)符號(hào)和有符號(hào)的轉(zhuǎn)換,大部分系統(tǒng)遵從的原則是底層的位表示保持不變宋列。
注:執(zhí)行一個(gè)運(yùn)算時(shí)昭抒,有符號(hào)與無(wú)符號(hào)的一起運(yùn)算,C會(huì)隱式將有符號(hào)強(qiáng)轉(zhuǎn)為無(wú)符號(hào)炼杖,并假設(shè)兩個(gè)數(shù)都是非負(fù)的來(lái)執(zhí)行灭返。
2.5.6 擴(kuò)展一個(gè)數(shù)字的位表示
無(wú)符號(hào)數(shù)轉(zhuǎn)換成一個(gè)更大的數(shù)據(jù)類型
補(bǔ)碼數(shù)字轉(zhuǎn)換成一個(gè)更大的數(shù)據(jù)類型
補(bǔ)碼數(shù)值的符合擴(kuò)展
注:一個(gè)數(shù)據(jù)大小到另一個(gè)數(shù)據(jù)大小的轉(zhuǎn)換,以及無(wú)符號(hào)和有符號(hào)之間的轉(zhuǎn)換能夠影響一個(gè)程序的行為坤邪。
2.2.7 截?cái)鄶?shù)字
截?cái)酂o(wú)符號(hào)數(shù)
截?cái)嘌a(bǔ)碼數(shù)值
2.2.8 關(guān)于有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的建議
若把字僅僅看作位的集合而無(wú)任何數(shù)學(xué)意義時(shí)熙含,則無(wú)符號(hào)數(shù)值非常有用。
無(wú)符號(hào)運(yùn)算的細(xì)微特征尤其是有符號(hào)數(shù)到無(wú)符號(hào)數(shù)的隱式轉(zhuǎn)換會(huì)導(dǎo)致錯(cuò)誤或漏洞艇纺。
2.3 整數(shù)運(yùn)算
2.3.1 無(wú)符號(hào)加法
字長(zhǎng)膨脹
無(wú)符號(hào)數(shù)加法
把整數(shù)x+y截?cái)酁閣位得到結(jié)果怎静,再把這個(gè)結(jié)果看做是一個(gè)無(wú)符號(hào)數(shù)。
檢測(cè)無(wú)符號(hào)數(shù)加法中的溢出
無(wú)符號(hào)數(shù)求反
2.3.2 補(bǔ)碼加法
檢測(cè)補(bǔ)碼加法中的溢出
2.3.3 補(bǔ)碼的非
執(zhí)行補(bǔ)碼非的兩種方法:
對(duì)每一位求補(bǔ)黔衡,再對(duì)結(jié)果加1蚓聘。
建立在將位向量分為兩部分的基礎(chǔ)之上的。
2.3.4 無(wú)符號(hào)乘法
C中定義產(chǎn)生為w位的值盟劫,就是2w位的整數(shù)乘積的低w位表示的值夜牡。
2.3.5 補(bǔ)碼乘法
將一個(gè)補(bǔ)碼數(shù)截?cái)酁閣位相當(dāng)于先計(jì)算該值莫2^w,再把無(wú)符號(hào)數(shù)轉(zhuǎn)換為補(bǔ)碼侣签。
對(duì)于無(wú)符號(hào)和補(bǔ)碼乘法來(lái)說(shuō)塘装,乘法運(yùn)算的位級(jí)表示都是一樣的急迂。
2.3.6 乘以常數(shù)
整數(shù)乘法指令比加、減蹦肴、位級(jí)運(yùn)算僚碎、移位要慢。
與2的冪相乘的無(wú)符號(hào)乘法
與2的冪相乘的補(bǔ)碼乘法
無(wú)論是無(wú)符號(hào)運(yùn)算還是補(bǔ)碼運(yùn)算冗尤,溢出時(shí)移位的結(jié)果是一樣的听盖。
很多C語(yǔ)言編譯器用移位、加裂七、減的組合來(lái)消除很多整數(shù)乘以常數(shù)的情況皆看。
2.3.7 除以2的冪
整數(shù)除法比乘法更慢。
右移背零。
無(wú)符號(hào)數(shù):邏輯移位
補(bǔ)碼數(shù):算術(shù)移位
除以2的冪的無(wú)符號(hào)除法
除以2的冪的補(bǔ)碼除法
對(duì)于非負(fù)數(shù)來(lái)說(shuō)腰吟,效果與邏輯右移一樣。
對(duì)于負(fù)數(shù)來(lái)說(shuō)徙瓶,不需要舍入時(shí)毛雇,x/(2^K);需要舍入侦镇,結(jié)果向下舍入灵疮。
通過(guò)移位前“偏置”這個(gè)值修正不合適的舍入。
關(guān)于偏置量的取值壳繁,當(dāng)a>=0時(shí)震捣,偏置量值為0;當(dāng)a<0時(shí)闹炉,設(shè)偏移量為n蒿赢,偏置量取值為(2^n-1)。
注:同乘法不同渣触,除以2的冪的除法不能用來(lái)表示任意常數(shù)K的除法羡棵。
2.3.8 關(guān)于整數(shù)運(yùn)算的最后思考
執(zhí)行“整數(shù)”運(yùn)算實(shí)際上是模運(yùn)算形式。
2.4 浮點(diǎn)數(shù)
2.4.1 二進(jìn)制小數(shù)
2.4.2 IEEE浮點(diǎn)表示
10進(jìn)制中嗅钻,125=0.125*10^3皂冰。那么可以說(shuō)任意一個(gè)J進(jìn)制數(shù)N,總可以寫成 N =? M * J^e
? 其中M是數(shù)N的尾數(shù)啊犬,M(0.125)是一個(gè)純小數(shù)
? e(3)就是N的階碼
C語(yǔ)言中的單精度浮點(diǎn)格式和雙精度浮點(diǎn)格式
根據(jù)exp的值灼擂,有以下3種情況:
規(guī)格化的值
exp不全為0(數(shù)值0)且不全為1(單255;雙2047)
階碼字段被解釋為以偏置Bias形式表示的有符號(hào)整數(shù)觉至。
非規(guī)格化的值
階碼域全為0剔应。
提供一種表示數(shù)值0的方法
表示非常接近于0.0的數(shù),逐漸溢出,可能的數(shù)值分布均勻地接近0.0
特殊值
2.4.3 數(shù)字示例
2.4.4 舍入
浮點(diǎn)運(yùn)算只能近似地表示實(shí)數(shù)運(yùn)算峻贮。
四種舍入方式:
向偶數(shù)舍入/向最接近的值舍入(默認(rèn)方式):對(duì)中間數(shù)舍入席怪,向上或向下使得結(jié)果最低有效數(shù)字是偶數(shù)
向零舍入:正數(shù)向下舍入,負(fù)數(shù)向上舍入
向下舍入
向上舍入
二進(jìn)制小數(shù)的舍入
2.4.5 浮點(diǎn)運(yùn)算
浮點(diǎn)數(shù)加法
浮點(diǎn)數(shù)乘法
2.4.6 C語(yǔ)言中的浮點(diǎn)數(shù)
支持IEEE浮點(diǎn)格式的機(jī)器纤控,float和double對(duì)應(yīng)單精度和雙精度浮點(diǎn)挂捻。使用向偶數(shù)舍入。
C不支持IEEE浮點(diǎn)船万。
int轉(zhuǎn)換成float刻撒,不會(huì)溢出,但可能被舍入耿导。
int或float轉(zhuǎn)換成double声怔,能保留精確數(shù)值。
double轉(zhuǎn)換float舱呻,可能溢出成正無(wú)窮或負(fù)無(wú)窮醋火,還可能被舍入。
float或double轉(zhuǎn)換int箱吕,值向零舍入芥驳。
2.5 小結(jié)
計(jì)算機(jī)編碼為位(比特),通常組織成字節(jié)序列茬高。
64位優(yōu)勢(shì)是可以突破32位程序具有4GB的地址限制兆旬。
大多數(shù)機(jī)器對(duì)整數(shù)使用補(bǔ)碼編碼,對(duì)浮點(diǎn)數(shù)使用IEEE標(biāo)準(zhǔn)754編碼怎栽。
再相同長(zhǎng)度的無(wú)符號(hào)和有符號(hào)整數(shù)之間進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)爵憎,C實(shí)現(xiàn)遵循的原則是位模式不變。
當(dāng)超出表示范圍時(shí)有限長(zhǎng)度能引起數(shù)值溢出婚瓜;當(dāng)浮點(diǎn)數(shù)非常接近于0.0從而轉(zhuǎn)換成零時(shí),會(huì)下溢刑棵。
無(wú)符號(hào)數(shù)和補(bǔ)碼的運(yùn)算都能滿足整數(shù)運(yùn)算的許多其他屬性巴刻,包括結(jié)合律、交換律蛉签、分配律胡陪。