資料的儲存

2021-10-10 17:15:25 字數 4081 閱讀 5996

資料型別介紹

char //字元資料型別

short //短整型

int //整形

long //長整型

long long //更長的整形

float //單精度浮點數

double //雙精度浮點數

型別的基本歸類

unsigned(無符號類)

signed(有符號類)

浮點數家族

float

double

指標型別

int pi;

char pc;

float pf;

void pv;

整形在記憶體中的儲存

原碼、反碼、補碼。

計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。

三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位

三種表示方法各不相同。

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

反碼將原碼的符號位不變,其他位依次按位取反就可以得到了。

補碼反碼+1就得到補碼。

正數的原、反、補碼都相同。

對於整形來說:資料存放記憶體中其實存放的是補碼。

大小端介紹

什麼大端小端:

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

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

為什麼有大端和小端:

為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著一

個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具

體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個字

節,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。

例如乙個 16bit 的 short 型 x ,在記憶體中的位址為 0x0010 , x 的值為 0x1122 ,那麼 0x11 為高位元組, 0x22

為低位元組。對於大端模式,就將 0x11 放在低位址中,即 0x0010 中, 0x22 放在高位址中,即 0x0011 中。小

端模式,剛好相反。我們常用的 x86 結構是小端模式,而 keil c51 則為大端模式。很多的arm,dsp都為小

端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。

浮點型在記憶體中的儲存

常見的浮點數:

3.14159 1e10 浮點數家族包括: float、double、long double 型別。 浮點數表示的範圍:float.h中定義

浮點數儲存的例子:

int

main()

{int n =9;

float

*pfloat =

(float*)

&n;printf

("n的值為:%d\n"

,n);

printf

("*pfloat的值為:%f\n"

,*pfloat)

;*pfloat =

9.0;

printf

("num的值為:%d\n"

,n);

printf

("*pfloat的值為:%f\n"

,*pfloat)

;

執行結果:

num 和 pfloat 在記憶體中明明是同乙個數,為什麼浮點數和整數的解讀結果會差別這麼大? 要理解這個結果,一定

要搞懂浮點數在計算機內部的表示方法。

詳細解讀:

根據國際標準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規定: 對於32位的浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位為有效數字m。

對於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。比如,2^10的e 是10,所以儲存成32位浮點數時,必須儲存成10+127=137,即10001001。

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

e不全為0或不全為1

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

加上第一位的1。 比如: 0.5(1/2)的二進位制形式為0.1,由於規定正數部分必須為1,即將小數點右移1位,

則為1.02^(-1),其階碼為-1+127=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位

00000000000000000000000,則其二進位制表示形式為: 0 01111110 00000000000000000000000

e全為0

這時,浮點數的指數e等於1-127(或者1-1023)即為真實值, 有效數字m不再加上第一位的1,而是還原為

0.******的小數。這樣做是為了表示±0,以及接近於0的很小的數字。

e全為1

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

好了,關於浮點數的表示規則,就說到這裡。

PostgreSQL的資料儲存 八 資料儲存

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

資料的儲存

1.整形在記憶體中的儲存 1 在計算機系統中,整數統一用補碼來表示和儲存。原碼 直接將二進位制按照正負數的形式翻譯成二進位制。反碼 將原碼的符號位不變,其他位按位取反。補碼 反碼加1就得到補碼。正數的原碼,反碼,補碼都相同 2 在記憶體中儲存時,還有大小端儲存方式 大端 儲存 模式,是指資料的低位儲...

資料的儲存

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