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

2021-09-28 14:27:22 字數 3741 閱讀 8810

字元型資料

1.字元與字元**

把字元的相對應的ascii碼(整數,對映關係見ascii碼表)放到儲存碼單元中,而這些ascii**值在計算機中同樣以二進位制補碼的形式存放的。

2.字元變數

字元型資料的儲存空間和值的範圍(32位操作平台)

型別位元組數

取值範圍

signed char(有符號字元數)

1-2^7 ~ (2^7-1)

unsigned char(無符號字元數)

10~(2^8-1)

整形資料

整形資料的儲存空間和值的範圍 (32操作平台)

型別位元組數

取值範圍

int(整形)

4-2^31 ~ (2^31-1)

unsigned int(無符號整形)

40 ~ (2^32-1)

short(短整型)

2-2^15 ~ (2^15-1)

unsigned short(無符號短整型)

20 ~ (2^16-1)

long(長整型)

4-2^31 ~ (2^31-1)

unsigned long(無符號長整形)

40 ~ (2^32-1)

long long(雙長整型)

8-2^63 ~ (2^63-1)

unsigned long long(無符號雙長整型)

80 ~ (2^64-1)

浮點型資料

float型(單精度浮點型)//4個位元組

double型(雙精度浮點型)//8個位元組

構造型別

>陣列型別  array

>結構體型別 struct

>列舉型別 enum

>聯合型別 union

指標型別

int

*pr //指向整形資料,只能儲存整形資料的位址

char

*pc //指向字元型資料,只能儲存字元型資料的位址

float

*pf //指向浮點型資料,只能儲存浮點型資料的位址

void

*pv //可以儲存位址,不能用來運算

空型別

void表示空型別(無型別)

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

1. 乙個變數的建立是要在記憶體中開闢空間的。空間的大小是根據不同的型別而決定的。

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

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

原碼

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

反碼

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

補碼

反碼+1就得到補碼。

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

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

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理; 同 時,加法和減法也可以統一處理(cpu只有加法器)此外,補碼與原碼相互轉換,其運算過程是相同的,不需 要額外的硬體電路。

2.資料儲存和讀取的差別

#include

intmain()

小結:%d %u 列印char 資料

a、整形提公升補0 還是1,取決於當前變數的型別和最高位1還是0

b、提公升之後是否求原始碼,取決於他是什麼型別的?

unsigned int ->原碼印char 資料

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

例如: 十進位制的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

有效數字m和指數e,還有一些特別規定。

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

至於指數e

首先,e為乙個無符號整數(unsignedint) 這意味著,如果e為8位,它的取值範圍為0 ~ 255;如果e為11位,它的取值範圍為0~2047。但是,我們知道,科學計數法 中的e是可以出現負數的,存入記憶體時e的真實值必須再加上乙個中間數,對於8位的e, 這個中間數是127;對於11位的e,這個中間數是1023。比如:2^10的e是10,所以儲存成32位浮點數時,必須儲存成10+127=137,即10001001。

總結

存時浮點數+127,取時浮點數-127

指數e還可以再分成三種情況:

1.e不全為0或不全為1

這時,浮點數就採用下面的規則表示,即指數e的計算值減去127(或1023),得到真實值,再將有效數字m加上第一位的1。 比如: 0.5(1/2)的二進位制形式為0.1,由於規定正數部分必須為1,即將小數點右移1位,則1.0*2^(-1),其階碼為-1+127=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位00000000000000000000000,則其二進位制表示形式為:

0

01111110

00000000000000000000000

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

3.e全為1(s為0,e全為1,則為float表示的最大正數)

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

補充

#include

intmain()

for(i=

0;i <

10;i++)if

(f>=

-0.000001

&& f <=

0.000001

)//浮點數與0的比較

return0;

}

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

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

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

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

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

char 字元資料型別 1個位元組 short 短整型 2個位元組 int 整型 4個位元組 long 長整型 4個位元組 long long 更長的整型 8個位元組 float 單精度浮點型 4個位元組 double 雙精度浮點型 8個位元組1,使用這個型別開闢記憶體空間的大小 2,如何看待記憶體...