您好,登錄后才能下訂單哦!
這篇文章主要介紹“C語言中數(shù)據(jù)的存儲舉例分析”,在日常操作中,相信很多人在C語言中數(shù)據(jù)的存儲舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言中數(shù)據(jù)的存儲舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
對于基本的c語言數(shù)據(jù)類型的基本歸類
char (內(nèi)存存儲的為ascall碼值,存儲為整數(shù)) unsigned char// unsigned為無符號關(guān)鍵字 signe char// short unsigned short (int)// (int )表示int可以省略不寫 signed short (int) int unsigned int signed int long unsigned long (int) signed long (int)
float
double
int* ptr; char* pa; float* pf; void* pv;
void 表示空類型(無類型)
通常應(yīng)用于函數(shù)的返回類型,返回參數(shù),指針類型
1.占據(jù)的內(nèi)存大小
2.作為數(shù)據(jù)時所操作的大?。礊閿?shù)據(jù)看待類型的視角)
計算機的(整形)有符號數(shù),有三種表示方法,原碼,反碼,補碼
三種表示方法 均存在 符號位 和 數(shù)值位 兩部分,符號位的‘0'表正,‘1'表示負,數(shù)值位表示方法有差異(對于無符號數(shù):原,反,補表示相同)
原碼:直接將數(shù)字按照正負,用二進制方法翻譯表示;
反碼:將原碼的符號位不變,其他位按位取反;
補碼:反碼+1;
對于正數(shù)而言,原,反,補相同:
int a=20; // 00000000 00000000 00000000 00010100 原碼 // 00000000 00000000 00000000 00010100 反碼 // 00000000 00000000 00000000 00010100 補碼
對于負數(shù)而言
int a=-1; // 10000000 00000000 00000000 00001010 原碼 // 11111111 11111111 11111111 11110101 反碼 // 11111111 11111111 11111111 11110110 補碼
對于整形數(shù)據(jù)而言再內(nèi)存存儲的是補碼
1.大端模式(大端字節(jié)序模式):較高的有效字節(jié)存儲在較低的存儲器地址,較低的有效字節(jié)存儲在較高的存儲器地址。
2.小端模式(小端字節(jié)序模式):較低的有效字節(jié)存儲在較低的存儲器地址,較高的有效字節(jié)存儲在較高的存儲器地址。
地址的視圖
低-------------------------------->--------高
關(guān)于設(shè)計判斷當(dāng)前機器的字節(jié)序
int check_sys(void) { int a=1; char* p=(char*)&a;//訪問第一個字節(jié)序看是 01.....0 還是 0...01 return *p; } int main() { int ret=check_sys(); if(ret==1) printf("小端"); else printf("大端"); }
在這里強制轉(zhuǎn)化成(char*)利用他只訪問一個字節(jié)的視角進行觀測
指針類型的意義
1.指針類型決定了指針類型解引用操作符能訪問幾個字節(jié)
2.指針+類型決定了指針+1跳過幾個字節(jié)
應(yīng)用前應(yīng)掌握的基本概念 整形提升
char a=-1; // -1作為整形數(shù)在內(nèi)存中以補碼形式存儲 // 10000000 00000000 00000000 0000001-原碼 // 11111111 11111111 11111111 1111110 - 反碼 // 11111111 11111111 11111111 1111111 -補碼 // 當(dāng)被賦予a時 a為char型只能存儲8個字節(jié) 就要發(fā)生 截斷 // 即 a 存儲為 1111111 signed char b=-1; // sigend為默認關(guān)鍵字 聲明和聲明都默認為有符號 // 同理 b 1111111 unsigned char c=-1; // c 1111111將高位當(dāng)做數(shù)值位對待 printf("%d %d %d ",a,b,c); // -1 -1 255 // 當(dāng)要打印為%d 應(yīng)當(dāng)發(fā)生整形提升 // 負數(shù)為有符號型 整形提升高位補1; // 無符號型提升高位補0,將原高位看作數(shù)值位 // 將 計算過程的 補碼 轉(zhuǎn)換為原碼后即為所求結(jié)果
char a=-128; printf("%u\n",a);
char a=-128; //10000000 00000000 00000000 10000000 //11111111 11111111 11111111 01111111 //11111111 11111111 11111111 10000000 // 截斷10000000 // char a 有符號 按符號位提升 //整形提升 11111111 11111111 11111111 10000000 作為 無符號數(shù) 原反補相同 //11111111 11111111 11111111 10000000-轉(zhuǎn)換為對應(yīng)的十進制數(shù)
有符號的(以下均為補碼)
有符號char范圍 -128 --127
例題
char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-1-i; } printf("%d",strlen(a));
對于 a[i]的計算結(jié)果 從 -1......-128..127....1 0
所以所得結(jié)果為 128+127=255
無符號(同補碼)
最高位視為數(shù)值位則 范圍為 0 ---255
例題
unsigned char i=0; for(i=0;i<255;i++) { printf(" hello\n"); }
思路同上
程序陷入死循環(huán)
到此,關(guān)于“C語言中數(shù)據(jù)的存儲舉例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。