《深入理解計(jì)算機(jī)系統(tǒng)》(原書第三版)筆記<一>

一逼纸、計(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é)合律、交換律蛉签、分配律胡陪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碍舍,隨后出現(xiàn)的幾起案子柠座,更是在濱河造成了極大的恐慌,老刑警劉巖片橡,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妈经,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吹泡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門骤星,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人爆哑,你說(shuō)我怎么就攤上這事洞难。” “怎么了揭朝?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵队贱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我潭袱,道長(zhǎng)柱嫌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任敌卓,我火速辦了婚禮慎式,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟径。我一直安慰自己瘪吏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布蜗巧。 她就那樣靜靜地躺著掌眠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幕屹。 梳的紋絲不亂的頭發(fā)上蓝丙,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音望拖,去河邊找鬼渺尘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛说敏,可吹牛的內(nèi)容都是我干的鸥跟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼盔沫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼医咨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起架诞,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拟淮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谴忧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體很泊,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡角虫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撑蚌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片上遥。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖争涌,靈堂內(nèi)的尸體忽然破棺而出粉楚,到底是詐尸還是另有隱情,我是刑警寧澤亮垫,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布模软,位于F島的核電站,受9級(jí)特大地震影響饮潦,放射性物質(zhì)發(fā)生泄漏燃异。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一继蜡、第九天 我趴在偏房一處隱蔽的房頂上張望回俐。 院中可真熱鬧,春花似錦稀并、人聲如沸仅颇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忘瓦。三九已至,卻和暖如春引颈,著一層夾襖步出監(jiān)牢的瞬間耕皮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工蝙场, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凌停,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓售滤,卻偏偏與公主長(zhǎng)得像苦锨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趴泌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361