資料的儲存

2021-09-19 20:49:28 字數 3476 閱讀 2577

1.整形在記憶體中的儲存

(1)在計算機系統中,整數統一用補碼來表示和儲存。

原碼:直接將二進位制按照正負數的形式翻譯成二進位制。

反碼:將原碼的符號位不變,其他位按位取反。

補碼:反碼加1就得到補碼。

(正數的原碼,反碼,補碼都相同)

(2)在記憶體中儲存時,還有大小端儲存方式:

大端(儲存)模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中;

小端(儲存)模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位,,儲存在記憶體的高位址中。

下面這個程式可以看出整形i 和 j 在記憶體中的儲存方式

(其中記憶體1取的是 i 的位址;記憶體2取的是 j 的位址。為小端機儲存模式)

我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。 有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。

還可以設計乙個程式來判斷當前機器的儲存模式如下;

#define _crt_secure_no_warnings 1

#include

#include

intcheck_sys()

intmain()

else

system

("pause");

return0;

}

此程式輸出為小端。

2.浮點型在記憶體中的儲存

浮點數的型別: float、double、long double 型別

根據國際標準ieee(電氣和電子工程協會) 754,任意乙個二進位制浮點數v可以表示成下面的形式:

①:(-1)^s * m * 2^e

②:(-1)^s表示符號位,當s=0,v為正數;當s=1,v為負數。

③:m表示有效數字,大於等於1,小於2。

④:2^e表示指數字

舉例來說: 十進位制的5.0,寫成二進位制是 101.0 ,相當於 1.01×2^2 。 那麼,按照上面v的格式,可以得出s=0, m=1.01,e=2。

十進位制的-5.0,寫成二進位制是 -101.0 ,相當於 -1.01×2^2 。那麼,s=1,m=1.01,e=2。

ieee 754規定:

(1) 對於單精度(32位)浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位為有效數字m。

(2)對於雙精度(64位)的浮點數,最高的1位是符號位s,接著的11位是指數e,剩下的52位為有效數字m。

注:ieee 754對有效數字m和指數e,還有一些特別規定。 前面說過, 1≤m<2 ,也就是說,m可以寫成 1.****** 的形 式,其中******表示小數部分。 ieee 754規定,在計算機內部儲存m時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的******部 分。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效 數字。以32位浮點數為例,留給m只有23位,將第一位的1捨去以後,等於可以儲存24位有效數字。

至於指數e,情況就比較複雜。

首先,e為乙個無符號整數(unsigned int) 這意味著,如果e為8位,它的取值範圍為0~255;如果e為11位,它 的取值範圍為0~2047。但是,我們知道,科學計數法中的e是可以出現負數的,所以ieee 754規定,存入記憶體時e 的真實值必須再加上乙個中間數,對於8位的e,這個中間數是127;對於11位的e,這個中間數是1023。

例子:float型資料125.5轉換為標準浮點格式

125二進位制表示形式為1111101,小數部分表示為二進位制為1,則125.5二進位制表示為1111101.1,由於規定尾數的整數部分恒為1,則表示為1.1111011*2^6,階碼為6,加上127為133,則表示為10000101,而對於尾數將整數部分1去掉,為1111011,在其後面補0使其位數達到23位,則為11110110000000000000000 則其二進位制表示形式為

0 10000101 11110110000000000000000,則在記憶體中存放方式為:

00000000 低位址

01000010 高位址

然後,指數e從記憶體中取出還可以再分成三種情況:

(1) e不全為0或不全為1

這時,浮點數就採用下面的規則表示,即指數e的計算值減去127(或1023),得到真實值,再將有效數字m 前加上第一位的1。

(2)e全為0 這時,浮點數的指數e等於1-127(或者1-1023)即為真實值, 有效數字m不再加上第一位的1,而是還原為 0.******的小數。這樣做是為了表示±0,以及接近於0的很小的數字。

(3) e全為1

這時,如果有效數字m全為0,表示±無窮大(正負取決於符號位s)

例子:根據二進位制形式求算浮點數

0 10000101 11110110000000000000000

由於符號位為零,即為正數,所以s=0;

e滿足上面e的第(1)種情況,所以真實e為133-127=6;

尾數為11110110000000000000000,它的真實尾數為:1.1111011

綜上表示為:(-1)^ 0 * 1.1111011 * 2 ^ 6,將小數點向右移動六位得到:1111101.1,十進位制大小為:125.5

練習題:

在這裡插入#define _crt_secure_no_warnings 1

#include

#include

intmain()

①:*pfloat的值為什麼為:0.000000 ?

9的二進位制位表示為 00000000 00000000 00000000 00001001

強轉成為float* 後:0(s) 00000000(e) 0000000 00000000 00001001(m)

由於e為全0,滿足上述e的第二種情況,所以真實e為(1-127)= -126

尾數0000000 00000000 00001001 ,它的真實尾數為:0.0000000 0000000000001001

綜上所述:v=(-1)^ 0 * 0.00000000000000000001001 * 2 ^ -126,看出v是乙個很小的數,十進位制表示為0.000000;

②:為什麼num的值為:1091567616 ?

9.0 -> 1001.0 ->(-1)^ 0 * 1.001 * 2 ^ 3 -> s=0, m=1.001,e=3+127=130

0 10000010 00100000000000000000000

這個32位的二進位制數,還原成十進位制,正是 1091567616

PostgreSQL的資料儲存 八 資料儲存

在作業系統層面,資料儲存,只是一些二進位制資訊,這個層次,是不知道檔案內容的含義的。檔案的邏輯含義,取決於應用層面。資料庫系統的檔案組織,也如此。在外存儲存,以二進位制格式存放,讀寫檔案,以塊 8k 為單位,讀入的資料,存放與資料緩衝區,所以,資料的邏輯含義,始於資料緩衝區。在bufpage.h檔案...

資料的儲存

列表是一種儲存大量資料的儲存模型。列表具有索引的概念,可以通過索引操作列表中的資料。列表中的資料可以進行新增 刪除 修改 查詢等操作。建立列表 變數名 資料1,資料2,獲取列表資料 變數名 索引 修改列表資料 變數名 索引 值 元組是一種儲存固定資料的儲存模型。元組具有索引的概念,可以通過索引操作元...

資料的儲存

計算機都是二進位制來儲存資料的。計算機用原碼,反碼,補碼來表示有符號數。資料有符號位和資料為,符號位有 0 和 1 1表示負數,0表示正數。原碼 直接將二進位制按照正負數的形式翻譯成二進位制就可以。反碼 將原碼的符號位不變,其他位依次按位取反就可以得到了。補碼 反碼 1就得到補碼。在這個簡單的程式中...