詳解C語言中數(shù)據(jù)的存儲
一、類型歸類
對于基本的c語言數(shù)據(jù)類型的基本歸類
1、整形家族
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)
2、浮點型家族
float
double
3、指針類型
int* ptr; char* pa; float* pf; void* pv;
4、空類型
void 表示空類型(無類型)
通常應(yīng)用于函數(shù)的返回類型,返回參數(shù),指針類型
二、類型的意義
1.占據(jù)的內(nèi)存大小
2.作為數(shù)據(jù)時所操作的大?。礊閿?shù)據(jù)看待類型的視角)
三、數(shù)據(jù)在類型中存儲(以整形和浮點型為例子)
1. 關(guān)于 存儲的基本概念
計算機的(整形)有符號數(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)存存儲的是補碼
2.存儲模式
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)用前應(yīng)掌握的基本概念 整形提升
1.
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為默認(rèn)關(guān)鍵字 聲明和聲明都默認(rè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é)果
2.
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范圍的討論
有符號的(以下均為補碼)
有符號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)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語言實現(xiàn)宿舍管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細介紹了C語言實現(xiàn)宿舍管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03C語言學(xué)生成績管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細介紹了C語言學(xué)生成績管理系統(tǒng)課程設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01Java?C++?算法題解拓展leetcode670最大交換示例
這篇文章主要介紹了Java?C++算法題解拓展leetcode670最大交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09