關於C語言中資料在記憶體中的儲存詳解

2022-09-27 05:03:14 字數 3681 閱讀 8676

1. 資料型別詳細介紹

2. 整形在記憶體中的儲存:原碼、反碼、補碼

3. 大小端位元組序介紹及判斷

4. 浮點型在記憶體中的儲存解析

1.整形家族

char

unsigned char

signed char

short

unsigned short [int]

signed short [int]

intunsigned int

signed int

long

unsigned long [int]

signed long [int]

2.浮點型家族float

double

3.構造型別陣列型別

結構體型別 struct

列舉型別 enum

聯合型別 union

4.指標型別int pi;

char pc;

float pf;

void pv;

5.空型別void 表示空型別(無型別)

通常應用於函式的返回型別、函式的引數、指標型別

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

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

三種表示方法各不相同。

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

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

**如下:

#define _crt_secure_no_warnings 1

#include

int main()

//00000000 00000000 00000000 00010100 20的補碼

//100000000 00000000 00000000 00001010 程式設計客棧 兩者相加,因為int只有32位丟掉最前面的

1程式設計客棧.大端小端的概念

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

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

2.大小端位元組序的由來為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。

例如乙個 16bit 的 short 型 x ,在記憶體中的位址為 0x0010 , x 的值為 0x1122 ,那麼 0x11 為高位元組, 0x22為低位元組。對於大端模式,就將 0x11 放在低位址中,即 0x0010 中, 0x22 www.cppcns.com放在高位址中,即 0x0011 中。小端模式,剛好相反。我們常用的 x86 結構是小端模式,而 keil c51 則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。

3.判斷系統是大端還是小端

**如下:

#define _crt_secure_no_warnings 1

#include

int findkey(int i)

int main()

else

return 0;

}**如下:

#define _crt_secure_no_warnings 1

#include

int main()

//11111111 11111111 11111111 11111111 -1的補碼,所以原碼為-1

//對於unsigned char來說 11111111 中1不是符號位所以高位補0

//00000000 00000000 00000000 11111111 所以為正數,原、反、補相同為255

**如下:

int main()

//11111111 11111111 11111111 10000000 128的補碼

//因為a是字元型別,所以發生截斷 10000000 a的值

//%u是列印無符號整形,所以發成整形提公升

//11111111 11111111 11111111 10000000

//%u是無符號整形,所以原碼、反碼、補碼相同

**如下:

int main()

//01111111 11111111 11111111 10000000 128的補碼

//因為a是char型別,所以發生截斷 10000000 -a

//%u是列印無符號整形,所以發生整形提公升,因為是char型別,所以高位是符號位

//11111111 11111111 11111111 100000000

//%u是無符號整形,所以原碼、反碼、補碼相同

**如下:

int main()

//00000000 00000000 00000000 00001010 10的原碼、反碼、補碼

//11111111 11111111 11111111 11110110 相加為補碼

//11111111 11111111 11111111 11110101 反碼

//10000000 00000000 00000000 00001010 補碼 為-10www.cppcns.com

**如下:

#define _crt_secure_no_warnings 1

#include

#include

int main()

return 0;

}**如下:

#define _crt_secure_no_warnings 1

#include

#include

int main()

return 0;

}**如下:

unsigned char i = 0;

int main()

return 0;

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

1.(-1)^s * m * 2^e

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

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

3.2^e表示指數字。

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

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

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

**如下:

#define _crt_secure_no_warnings 1

#include

int main()

以上就是今天要講的內容,本文僅僅簡單介紹了資料整形和浮點型在記憶體中的儲存,了解這個更能令我們了解資料怎麼在記憶體中儲存。另外,如果上述有任何問題,請懂哥指教,不過沒關係,主要是自己能堅持,更希望有一起學習的同學可以幫我指正,但是如果可以請溫柔一點跟我講,愛與和平是永遠的主題,愛各位了。

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表示 負 而數值位三種表示方法各不相同。原碼直接將二進位制按照正負數的形式翻譯成二進位制就可以。反碼將原碼的符號位不變,其他位依次按位取反就可以得到了...