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