資料在記憶體中的儲存(C語言)

2021-10-10 19:39:15 字數 3866 閱讀 2924

c語言中的基本內建型別:charshortintlonglong longfloatdouble

為什麼存在型別這個概念,型別的意義何在?

1.使用這個型別所開闢的空間的大小,決定了它的使用範圍。

2.決定如何看待記憶體空間的視角,假如我們對乙個指標進行解引用,應該從該指標的起始位址讀多少個位元組呢?就是它的型別所決定的。

型別的簡單分類:

整數型別

浮點數型別

構造型別

指標型別

unsigned char

float

陣列型別

int* x

signed char

double

結構體型別(struct)

char* x

unsigned short [int]

-列舉型別(enum)

float* x

signed short [int]

-聯合型別(union)

void* x

unsigned int--

int (*x)[size] 陣列指標

signed int--

int (*fun)() 函式指標

unsigned long [int]--

…signed long [int]--

另外還有一種型別為:void,表示空型別(無型別)。通常應用於函式的返回值、函式的引數、指標型別。

首先,我們先來了解幾個簡單的而且最基本的概念:

原碼、反碼、補碼

原碼:最高位為符號位(正數為0,負數為1),然後直接將絕對值翻譯成二進位制就可以了。

反碼:將原碼的符號位保持不變,剩餘二進位制按位取反即可。

補碼:對反碼+1就可以得到對應的補碼了。

注:正數的原碼和補碼是一樣的!

對於整數來說,在計算機中儲存的就是補碼。

那麼,我們一定有個疑問,為什麼要儲存補碼呢?存補碼不是更麻煩嗎?

在計算機系統中,數值一律用補碼來表示和儲存。其原因是。使用補碼,可以將符號位和數值域統一進行處理;同時,加法運算和減法運算可以看成一種運算,他們可以統一處理(cpu只有加法器),還有一點,我們求補碼的原碼,也就是求補碼的補碼,其運算過程一樣,也就不需要額外的硬體電路。

接下來我們介紹一下,大端儲存和小端儲存

什麼是大端小端?

大端儲存模式就是,資料的低權值位儲存在記憶體高的位址中,而資料的高權值位儲存在記憶體的低位址中。

小端儲存模式就是,資料的高權值位儲存在記憶體高的位址中,而資料的低權值位儲存在記憶體的低位址中。

如何判斷大端儲存和小端儲存?
#include

intcheck_sys()

intmain()

else

return0;

}

*(char*)&iint*型的指標強轉為char*型別,然後對char*指標進行解引用,就可以取出4個位元組中位址最低的那乙個位元組的內容,然後在主函式中if判斷,如果取出的是1那麼就說明低位址儲存的是低位元組的內容,就是小端儲存,反之就是大端儲存。

我們常見的浮點數型別有:floatdoublelong doule

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

·(-1)s * m * 2e

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

·m表示有效數字,大於等於1,小於2

·2e表示指數字

舉個例子:十進位制中的5.0,寫成二進位制就是101.0,相當於1.01x2^2。然後我們按照上面的方式,可以得出s = 0m = 1.01e = 2。那麼,十進位制中的-5.0,寫成上面的方式就是,s = 1m = 1.01e = 2,只有s不一樣。

ieee754規定:對於32位的浮點數,最高的1位是符號位s,接下來8位是指數e,剩下的23位為有效數字m

注意:

e為無符號數,那麼我們會發現,我們的無符號數就無法用來表示負數了,但是我們是需要使用負指數的,所以我們取了乙個中間數(8位二進位制數,表示的最大的數是255),我們就取了127所以我們在存入的時候,就會對本身的e加上127,然後取出的時候,就會再次加上127,來獲得正確的值。

我們同時也會發現,我們的有效數字m是乙個大於1且小於2的數字,也就是說,它的格式一定為1.***,那麼,我們就可以把這個1.在存的時候去掉,只需要將***存入即可,在我們需要取出的時候,在給它加上1.

特殊情況:

e中的8bit全為0的時候,我們會發現,真正的e現在是0-127=-127他就是2^-127,這個時候無論正負,或者m的大小,它都是乙個極小的數字,這個時候,我們規定它就為0

e中的8bit全為1的時候,我們會發現,真正的e現在是255-127=128它就是2^128,這個時候無論正負,或者m的大小,它都是乙個極大的數字,這個時候,我們規定它就為無窮大。

如果e中的8bit不全為0或不全為1的時候,我們就按照正常的公式(-1)s * m * 2e來進行計算。

希望本文章可以幫助你簡單理解資料在記憶體中的儲存。

作者部落格:

C語言 資料在記憶體中的儲存

字元型資料 1.字元與字元 把字元的相對應的ascii碼 整數,對映關係見ascii碼表 放到儲存碼單元中,而這些ascii 值在計算機中同樣以二進位制補碼的形式存放的。2.字元變數 字元型資料的儲存空間和值的範圍 32位操作平台 型別位元組數 取值範圍 signed char 有符號字元數 1 2...

資料在記憶體中的儲存c語言

基本內建型別 char 字元資料型別 short 短整型 int 整形 long 長整型 long long 更長的整形 float 單精度浮點數 double 雙精度浮點數使用這個型別開闢的記憶體空間大小 大小決定了適用範圍 如何看待記憶體空間的視角。在32位平台下,任何指標型別都只佔4個位元組。...

C語言 資料在記憶體中的儲存

得從整形在記憶體中的儲存說起 計算機中的有符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位三種表示方法各不相同。原碼直接將二進位制按照正負數的形式翻譯成二進位制就可以。反碼將原碼的符號位不變,其他位依次按位取反就可以得到了...