詳解C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)
一、類(lèi)型歸類(lèi)
對(duì)于基本的c語(yǔ)言數(shù)據(jù)類(lèi)型的基本歸類(lèi)
1、整形家族
char (內(nèi)存存儲(chǔ)的為ascall碼值,存儲(chǔ)為整數(shù)) unsigned char// unsigned為無(wú)符號(hào)關(guān)鍵字 signe char// short unsigned short (int)// (int )表示int可以省略不寫(xiě) signed short (int) int unsigned int signed int long unsigned long (int) signed long (int)
2、浮點(diǎn)型家族
float
double
3、指針類(lèi)型
int* ptr; char* pa; float* pf; void* pv;
4、空類(lèi)型
void 表示空類(lèi)型(無(wú)類(lèi)型)
通常應(yīng)用于函數(shù)的返回類(lèi)型,返回參數(shù),指針類(lèi)型
二、類(lèi)型的意義
1.占據(jù)的內(nèi)存大小
2.作為數(shù)據(jù)時(shí)所操作的大?。礊閿?shù)據(jù)看待類(lèi)型的視角)
三、數(shù)據(jù)在類(lèi)型中存儲(chǔ)(以整形和浮點(diǎn)型為例子)
1. 關(guān)于 存儲(chǔ)的基本概念
計(jì)算機(jī)的(整形)有符號(hào)數(shù),有三種表示方法,原碼,反碼,補(bǔ)碼
三種表示方法 均存在 符號(hào)位 和 數(shù)值位 兩部分,符號(hào)位的‘0'表正,‘1'表示負(fù),數(shù)值位表示方法有差異(對(duì)于無(wú)符號(hào)數(shù):原,反,補(bǔ)表示相同)
原碼:直接將數(shù)字按照正負(fù),用二進(jìn)制方法翻譯表示;
反碼:將原碼的符號(hào)位不變,其他位按位取反;
補(bǔ)碼:反碼+1;
對(duì)于正數(shù)而言,原,反,補(bǔ)相同:
int a=20; // 00000000 00000000 00000000 00010100 原碼 // 00000000 00000000 00000000 00010100 反碼 // 00000000 00000000 00000000 00010100 補(bǔ)碼
對(duì)于負(fù)數(shù)而言
int a=-1; // 10000000 00000000 00000000 00001010 原碼 // 11111111 11111111 11111111 11110101 反碼 // 11111111 11111111 11111111 11110110 補(bǔ)碼
對(duì)于整形數(shù)據(jù)而言再內(nèi)存存儲(chǔ)的是補(bǔ)碼
2.存儲(chǔ)模式
1.大端模式(大端字節(jié)序模式):較高的有效字節(jié)存儲(chǔ)在較低的存儲(chǔ)器地址,較低的有效字節(jié)存儲(chǔ)在較高的存儲(chǔ)器地址。
2.小端模式(小端字節(jié)序模式):較低的有效字節(jié)存儲(chǔ)在較低的存儲(chǔ)器地址,較高的有效字節(jié)存儲(chǔ)在較高的存儲(chǔ)器地址。
地址的視圖
低-------------------------------->--------高
關(guān)于設(shè)計(jì)判斷當(dāng)前機(jī)器的字節(jié)序
int check_sys(void) { int a=1; char* p=(char*)&a;//訪問(wèn)第一個(gè)字節(jié)序看是 01.....0 還是 0...01 return *p; } int main() { int ret=check_sys(); if(ret==1) printf("小端"); else printf("大端"); }
在這里強(qiáng)制轉(zhuǎn)化成(char*)利用他只訪問(wèn)一個(gè)字節(jié)的視角進(jìn)行觀測(cè)
指針類(lèi)型的意義
1.指針類(lèi)型決定了指針類(lèi)型解引用操作符能訪問(wèn)幾個(gè)字節(jié)
2.指針+類(lèi)型決定了指針+1跳過(guò)幾個(gè)字節(jié)
四.應(yīng)用
應(yīng)用前應(yīng)掌握的基本概念 整形提升
1.
char a=-1; // -1作為整形數(shù)在內(nèi)存中以補(bǔ)碼形式存儲(chǔ) // 10000000 00000000 00000000 0000001-原碼 // 11111111 11111111 11111111 1111110 - 反碼 // 11111111 11111111 11111111 1111111 -補(bǔ)碼 // 當(dāng)被賦予a時(shí) a為char型只能存儲(chǔ)8個(gè)字節(jié) 就要發(fā)生 截?cái)? // 即 a 存儲(chǔ)為 1111111 signed char b=-1; // sigend為默認(rèn)關(guān)鍵字 聲明和聲明都默認(rèn)為有符號(hào) // 同理 b 1111111 unsigned char c=-1; // c 1111111將高位當(dāng)做數(shù)值位對(duì)待 printf("%d %d %d ",a,b,c); // -1 -1 255 // 當(dāng)要打印為%d 應(yīng)當(dāng)發(fā)生整形提升 // 負(fù)數(shù)為有符號(hào)型 整形提升高位補(bǔ)1; // 無(wú)符號(hào)型提升高位補(bǔ)0,將原高位看作數(shù)值位 // 將 計(jì)算過(guò)程的 補(bǔ)碼 轉(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 // 截?cái)?0000000 // char a 有符號(hào) 按符號(hào)位提升 //整形提升 11111111 11111111 11111111 10000000 作為 無(wú)符號(hào)數(shù) 原反補(bǔ)相同 //11111111 11111111 11111111 10000000-轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制數(shù)
對(duì)于char范圍的討論
有符號(hào)的(以下均為補(bǔ)碼)
有符號(hào)char范圍 -128 --127
例題
char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-1-i; } printf("%d",strlen(a));
對(duì)于 a[i]的計(jì)算結(jié)果 從 -1......-128..127....1 0
所以所得結(jié)果為 128+127=255
無(wú)符號(hào)(同補(bǔ)碼)
最高位視為數(shù)值位則 范圍為 0 ---255
例題
unsigned char i=0; for(i=0;i<255;i++) { printf(" hello\n"); }
思路同上
程序陷入死循環(huán)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- C語(yǔ)言二進(jìn)制思想以及數(shù)據(jù)的存儲(chǔ)
- C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)詳解
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)和取出詳細(xì)講解
- C語(yǔ)言詳細(xì)圖解浮點(diǎn)型數(shù)據(jù)的存儲(chǔ)實(shí)現(xiàn)
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)詳解
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解中篇練習(xí)
- 帶你了解C語(yǔ)言的數(shù)據(jù)的存儲(chǔ)
- C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)詳解
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語(yǔ)言?棧與數(shù)組的實(shí)現(xiàn)詳解
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱(chēng)為棧頂,相對(duì)地,把另一端稱(chēng)為棧底。向一個(gè)棧插入新元素又稱(chēng)作進(jìn)棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素2022-04-04C++實(shí)現(xiàn)線程池的簡(jiǎn)單方法示例
這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)線程池的簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05C++編譯器無(wú)法捕捉到的8種錯(cuò)誤實(shí)例分析
這篇文章主要介紹了C++編譯器無(wú)法捕捉到的8種錯(cuò)誤,是深入學(xué)習(xí)C++所必須加以掌握的排錯(cuò)技能,需要的朋友可以參考下2014-09-09C++ std::shared_mutex讀寫(xiě)鎖的使用
本文主要介紹了C++ std::shared_mutex讀寫(xiě)鎖的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java?C++?算法題解拓展leetcode670最大交換示例
這篇文章主要介紹了Java?C++算法題解拓展leetcode670最大交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09