C語言程式設計資料在記憶體中的儲存詳解

2022-09-24 13:00:10 字數 3219 閱讀 4726

目錄

c語言中,有幾種基本內建型別。

intunsigned int

signed int

char

unsigned char

signed char

long

unsigned long

signed long

float

double

在記憶體中建立變數,會在記憶體中開闢空間,並為其賦值。

int a=10;

在計算機中,所有資料都是以二進位制的形式儲存在記憶體中。

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

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

反碼+1就得到補碼

對於整型

intchar

型別的資料而言,資料存放記憶體中其實存放的是補碼。並且,運算時也是以補碼的形式進行運算。

再來了解一下資料在記憶體中的儲存模式。

同時要求,資料以什麼模式存如記憶體中,還要以什麼順序拿出。

現在,vs好像都是以小端模式進行儲存。

來做幾道題,去研究資料在記憶體中的儲存

在原,反,補碼中。如果是有符號的第一位,就是符號位,0為正,-1為負。

#include

int main()

a為-1,所有整型,初始認為是int型別,32個二進位制位。

a:10000000 00000000 00000000 00000001-原碼

-----11111111 11111111 11111111 11111110-反碼

-----11111111 11111111 11111111 11111111-補碼

在賦給char型別。當然,一切運算都是以補碼的形式進行。無論是型別提公升,還是截斷,都是以補碼的形式,只有表示的時候才會回到原碼。

11111111 11111111 11111111 11111111-補碼

截斷-char型

11111111-a

又要求以%d列印,**就需要整型提公升,而整型提公升要看a這個變數本身的型別。**如果變數是無符號的就補0,有符號的如果符號位是1就補1.這個a是有符號的型別,符號位又是1是個負數,就補符號位1.

1111111 111111111 11111111 11111111-提公升後程式設計客棧的補碼

再有符號的十進位制數列印,還要看補碼的符號位,如果是正數,就原反補相同。

11111111 11111111 11111111 11111110-反碼。

10000000 00000000 00000000 000000001-原碼

在列印就是-1

b和a是一樣的有符號的都是-1。

c是無符號的char但,-1

----10000000 00000000 00000000 00000001-原碼

-----11111111 11111111 11111111 11111110-反碼

-----11111111 11111111 11111111 11111111-補碼

再賦給c進行截斷。

還是11111111-補碼

進行整型提公升,就要看c,是無符號,則第1個1就是不是符號位。則補0,就行了。

00000000 00000000 00000000 11111111-補碼

再看以什麼型別進行列印,有符號整型,再看符號位是0,就代表是正數,就原反補相同。直接列印255.

1,整型資料,初始時預設int,32個位元位,先變成補碼再截斷或提公升,再賦值給某個型別的變數(原碼轉反碼,符號位不變11)。

2,所有資料在記憶體中都是以補碼的形式進行儲存,以及運算,包括各種整型提公升與截斷。運算時都要整型提公升成32位,再看是否截斷。

3,整型提公升時,要看該變數的型別,如果是有符號型別,看第乙個二進位制位符號位,如果符號位是1,就補1,如果是0,就補0。如果變數是無符號型別,就全補0。

4,列印時,要考慮,以什麼形式列印。如果是%d,有符號的十進位制進行列印,要看提公升後的符號位,如果是1,就代表是負數,要轉為原碼列印,如果是0,就直接列印(正數原,反,補碼都一樣)。如果是無符號的列印,就代表其補碼代表的就是乙個無符號數的補碼,則原反補相同,就是補碼直接列印。

再來多看幾道題

#include

int main()

a10000000 00000000 00000000 10000000-原碼

111111111 111111111 111111111 011111111-反碼

111111111 111111111 111111111 10000000-補碼

補碼再進行截斷

要以無符號十進位制進行列印。整型提公升

111111111 111111111 111程式設計客棧111111 10000000

因為是無符號列印,就代表,這個補碼代表的是乙個無符號數。

直接就是原碼。

11111111 11111111 11111111 10000000-原碼

列印為4294967168

#include

int main()

printf("%d",strlen(a));

return 0;

}10000000000000000000000010000001- -129原碼

11111111111111111111111101111110-反碼

11111111111111111111111101111111-補碼

因為是放進char型別記憶體,要截斷,

011111111

按照char 型別的補碼對比,就是127。

會是一類迴圈的數字題目中,從-1走到-128,再從-128到127,再到1,0.

\0的ascii碼值就是0,再char型別中,0就代表\0。所以會計算255個數。

根據標準,所有的浮點數都能

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

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

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

2^e表示指數字

9.01001.0--------(-1)^ 0 * 1.001*2^3

m的值都是大於等於1,小於二

而m處都是儲存001,也就是小數點後的數字。

且,e處,是要e+127再放進e處。

將9.0儲存進記憶體中,

0 100000010 00100000000000000000000

(-1)^0*1.001          *2^(130-127)

如果e中儲存的都是0或都是1,就會出現極小值或極大值。

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