深入理解計算機系統之資料的表示與儲存

2021-08-04 19:49:27 字數 2921 閱讀 1533

在編寫程式的時候,不同資料型別進行轉換和計算的時候總是可能出現各種各樣奇怪的bug,所以深入的了解計算機系統中資料的表示與儲存有利於我們編寫高效與健壯的電腦程式,本文主要總結計算機系統中整數,浮點數的表示和儲存。

真值指的就是現實當中的正負數,而補碼是計算機中表示真值的一種編碼方式,也就是0/1編碼的序列。

補碼與真值的關係如下:

其中n表示機器的字長,x是真值。

求真值的補碼

正數的補碼為其本身,負數的補碼為正數的原碼各位取反加1,簡便的方法為從右到左遇到的第乙個1的前面各位取反。

如:假設機器數為8位,+123的補碼為01111011,-123的補碼為10000101。

求補碼的真值

公式為:

例子:

簡便求法:

符號為0,則為正數,數值部分相同,符號為1,則為負數,數值各位取反再加1.

如:01010110的真值為1010110=64+16+4+2=86. 11010110的真值為-0101001=-(32+8+2)=-42.

整數分別無符號數和帶符號數,帶符號數中編碼的最高有效位為1代表為負數,為0代表為整數。對於c編譯器,如果乙個表示式同時存在無符號數和帶符號數,則會將帶符號數強制轉換成無符號數。無符號數通常在乙個數的後面加乙個」u」或者」u」。

如下面的例子:

不同版本編譯器在處理常量預設的型別是不同的:

特別注意的是2147483648這個值為2的31次方,在c90和c99的編譯器中分別當成了無符號數unsigned int和帶符號數long long處理,其範圍是不一樣的。

例項:如c表示式-2147483648<2147483647的執行結果在不用系統的值可能為false也可能為true。因為如果在c90標準下,2147483648為unsigned int型別,則-2147483648<2147483647按照無符號數來比較,-2147483648變成無符號數為10…..0b比2147483647(01….1b)大,所以結果為false.而在c99標準中,2147483648被當做long long帶符號數處理,所以-2147483648<2147483647的結果為true.同理下面的例子也同樣可以得出結果。

int i=-2147483648;

bool res=i<2147483647;//true,帶符號數處理

/>>>>>>>>>>>>>>>/

-2147483647-1

<2147483647;//true

程式驗證:

#include 

int main()

在c90標準下的結果:

單精度的編碼方式如下:

s代表符號位:1代表負數,0代表整數。

exponent代表階碼(指數),佔8位。單精度規格化的階碼範圍為-126~127,雙精度為-1022~1023。

significand表示尾數部分。

表示式如下:

例項:

已知float變數x的機器數為bee00000h,求x的值
bee00000h=1|0111 1101|110 0000 0000 0000 0000 0000,由單精度格式有s=1,exponent=0111 1101=125,significand=110 0000 0000 0000 0000 0000。

則代入單精度表示式得真值為-0.4375。

已知float變數x的值為-1028,求x的值
-1028=-0100 0000 0100=-1.00 0000 0100b*2^10,因此s=1,階碼e=127+10=137=1000 1001,significant=0000 0001 0000 0000 0000 000 .

則x=1100 0100 1000 0000 1000 0000 0000 0000=c4808000.

大端順序指的是資料的最高有效資料存放於低位址。而小端順序指的是資料的最低有效資料存放於低位址。

如乙個數:0xffff0001其大小端存放順序如下:

程式驗證乙個cpu的大小端方式

#include 

int main()

num;

num.a=0x12345678;

if(num.b=0x12)

printf("big endian \n");

else

printf("little endian \n");

printf("num.b = 0x%x \n",num.b);

}

結果:

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...

深入理解計算機系統

系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...