C語言 char型別與記憶體單元理解

2021-09-28 16:44:41 字數 3689 閱讀 7989

特點一:c++/c裡面整個程式執行中型別不可變

強轉不是轉型別,而是數值的轉換

python指令碼語言,型別可變 隨著資料變化而變化型別

特點二:所有函式和變數都是先定義,再使用,不能邊定義邊使用 question2:

.c .cpp檔案是原始檔(文字檔案)

.c->.cpp 預編譯 文字->文字,預編譯只處理標頭檔案#

引入 不執行具體程式指令

.i 預編譯檔案(.i文字檔案 )

.i->.obj 編譯過程 處理型別的合法與否 語法 語義 詞法

.obj .o 編譯後的目標檔案(二進位制檔案) linux環境下常用

.obj ->.exe 鏈結 最後轉為可執行檔案

涉及到後面的靜態鏈結庫和動態鏈結庫

.exe 可執行檔案

可執行檔案被排程後 給其分配區域(空間)記憶體分為四個段

.code **段 .date 資料段

.heap 堆區 .stack 棧區

口訣:凡是在函式外定義的變數 都是在資料區 .date --全域性變數

凡是在函式內定義的變數 都是在棧區 .stack

存在例外情況:後續補充

提問:為什麼我們會對程式分這四個區域?reason?

為什麼在編譯的時候會分為預編譯,編譯,鏈結這幾個過程?

分類:char; //1 位元組 short;//2 位元組   int;//4 位元組  

bool;//1位元組           float;//4 位元組 

long int;//4 位元組

double;//8 位元組

long double;//8 //c11標準下 12

1位元組 = 1個儲存單元 = 8 bit (8個1/0數字)

注意區分字元與位元組;

char ch = 『a』; //存放的不是字元 而是ascii碼

char ch = 97 ; //char ch 0x61; 0x十六進製制

這兩個其實意思是一樣的

究竟輸出字元還是數字 由格式控制符決定 由程式設計師決定

char => mini_int 字元 1位元組整型

char a = 『0』; //字元0ascii碼是48 二進位制 => 0011 0000

char b = 0; //數字0min_int二進位制 0000 0000

所有轉十進位制都是對應數字乘以進製的冪

128 64 32 16 8 4 2 1 算二進位制

二進位制從中間劈開 拆成 8421 8421 算16進製制;

每三位劈開 拆成 421 421 算8進製

int a =10;

//十進位制數 10 逢十進一

int b =

010;

//八進位制數 8 逢八進一

int c =

0x10

;//十六進製制 16 逢十六進一

原始碼:反碼:符號位不變 在原始碼基礎上 求反

補碼: 符號為不變 在反碼基礎上 求反+1

正數 原始碼反碼 補碼都一樣

結論:在記憶體中按補碼存放

char a = 5; //0 000 0101 0x05

char b = -5; //1 000 0101 源

//1 111 1010 反

//1 111 1011 0xfb 補

//算16進製制的時候不管是不是符號為都算進去

問題:為什麼記憶體中儲存資料的時候按照補碼來存?

解釋:由於計算機只有加法器 cpu 只做 加法 移位 取反

無符號數則是一條從0-256的直線

有符號數:10000000

因為沒有負0這個說法

所以1000 0000是魔鬼數字這裡的1既是符號又是數值

所以:1000 0000 是-128

(127)2 + 1 = (-128)2

無符號數:1000000

128 64 32 16 8 4 2 1

1  000000 為128

#includeusing namespace std;

int main()

無符號數 無 負數,見到負數就加上當前型別的範圍,把他轉化為正數無符號數在取模運算中的使用

整型中:若把範圍小的給範圍大的:

自身有符號 擴充符號位->因為賦值之後符號不變,數值不變

自身無符號,擴充0

若把範圍大的給範圍小的:切片現象保留低位

舉例:

char a = 5;  // 00000101

擴充後://原始碼=補碼:00000000 00000000 00000000 00000101 =>5

char b = -5;

擴充後: //原始碼:11111111 11111111 11111111 11111011

//反碼:00000000 00000000 00000000 00000100

//補碼:10000000 00000000 00000000 00000101 => -5

char a = 100; 0110 0100  //擴充前01100100

//擴充後:00000000 00000000 00000000 01100100

char b = 200; 1100 1000 //擴充前:11001000

//擴充後:11111111 11111111 11111111 11001000

解釋:

正數0~127 有128個數字 char要對127這個數字敏感

負數-128~-1 有128個數字

128+128 =256一圈0~255 總共有256個數

200超過了127此時相當應該是-56

200在處理器中屬於負數!!!

所以擴充套件的時候是前面是111111111……

C 引用 記憶體單元的別名

1 引用是記憶體單元的別名 例如 int b a 給a取乙個別名為b,但不能寫成 b a 引用一定是和型別結合使用的。2 雖然引用是別名,但是c 在底層是以指標的方式來支援引用的特性的,在所有使用到引用變數的地方,系統都會自帶解引用過程。在下面的 中分別用了引用和指標,我們檢視一下反彙編,我們發現兩...

C語言 char型別變數範圍

c語言中字元型別也是屬於整型,是否可以用signed和unsigned修飾符?若初系統只提供了127個字元,那麼就將char型別變數的第乙個二進位制位設定為0,用後面7位存放0 127,此時,系統提供的char型別相當於signed char 但實際應用中可用的字元往往會多於127個,據此有的系統提...

C語言資料型別char

char簡介 char是c c 中的基本資料型別,可容納單個字元的一種基本資料型別。char佔乙個位元組,也就是8個bit 二進位制位 0000 0000 1111 1111,在無符號型別時char表示的範圍是0 255,在有符號型別時char表示的範圍是 128 127,可以表示256個整數。注 ...