C語(yǔ)言數(shù)據(jù)的存儲(chǔ)專(zhuān)項(xiàng)分析
數(shù)據(jù)的類(lèi)型介紹
類(lèi)型的基本歸類(lèi)
在寫(xiě)數(shù)據(jù)類(lèi)型的介紹之前,我們首先來(lái)簡(jiǎn)單介紹下 release版本與debug版本之間的在內(nèi)存上的區(qū)別:
我們先將下面的一段代碼在VS中運(yùn)行一下,得到的結(jié)果是截然不同的
int i = 0; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); }
將這段代碼在debug版本下得到的結(jié)果是 hehe死循環(huán),如下圖所示
從這里可以看到,hehe是在死循環(huán)的
將這段代碼在Release版本下得到的結(jié)果是 13個(gè)hehe
根本的原因是這兩個(gè)版本下,數(shù)據(jù)存儲(chǔ)的方式不同
以下是簡(jiǎn)圖:
上面這張圖就展示了兩者的區(qū)別,當(dāng)編譯器從低地址處往高地址處走時(shí),debug環(huán)境下,arr數(shù)組結(jié)束時(shí)如果再繼續(xù)往下運(yùn)行就會(huì)改變 i 的值,使 i的值初始化為0。release環(huán)境下arr數(shù)組結(jié)束時(shí)并不會(huì)改變i的值,因此并不會(huì)陷入死循環(huán)。
接著,回憶一下c語(yǔ)言中的數(shù)據(jù)基本類(lèi)型:
1、整形家族有
char
注:字符類(lèi)型的本質(zhì)是ASCII碼值,是整形,因此劃分到整形家族。
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
除了char類(lèi)型,其他類(lèi)型的數(shù)據(jù)在沒(méi)有特定的說(shuō)明下,默認(rèn)是有符號(hào)類(lèi)型。char類(lèi)型取決于編譯器。
2、浮點(diǎn)數(shù)家族
float 精度低,存儲(chǔ)的數(shù)值范圍較小
double 精度高,存儲(chǔ)的數(shù)值范圍更大
3、構(gòu)造類(lèi)型(自定義類(lèi)型,我們可以創(chuàng)建出新的類(lèi)型)
數(shù)組類(lèi)型
結(jié)構(gòu)體類(lèi)型 struct
枚舉類(lèi)型 enum
聯(lián)合類(lèi)型 union
4、指針類(lèi)型
int *pi
char *pc
float* pf
void* pv
5、空類(lèi)型
1、void 表示空類(lèi)型(無(wú)類(lèi)型)
2、通常應(yīng)用于函數(shù)的返回類(lèi)型、函數(shù)的參數(shù)、指針類(lèi)型
看下面的代碼舉例
void test(void) { //第一個(gè) void 表示函數(shù)沒(méi)有返回值 //第二個(gè) void 表示函數(shù)不需要任何參數(shù) printf("hehe\n"); } int main() { test(1); return 0; }
整形在內(nèi)存中的存儲(chǔ)
源碼、反碼、補(bǔ)碼
計(jì)算機(jī)中的整數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼
三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是
用0表示“正”,用1表示“負(fù)”,而數(shù)值位負(fù)整數(shù)的三種
表示方法各不相同。
原碼:直接將二進(jìn)制按照正負(fù)數(shù)的形式翻譯成二進(jìn) 制就可以。
反碼:將原碼的符號(hào)位不變,其他位依次按位取反就可以得到了。
補(bǔ)碼:反碼+1就得到補(bǔ)碼。
正數(shù)的原碼、反碼、補(bǔ)碼都一樣,對(duì)于整形來(lái)說(shuō):數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼
具體原因我們?cè)诖瞬欢嘧鼋忉尅?/p>
關(guān)于大小端的概念
什么是大小端?其實(shí)就是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)模式,大端存儲(chǔ)模式和小端存儲(chǔ)模式。
大端(存儲(chǔ))模式:是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址
中; 小端(存儲(chǔ))模式:是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位,,保存在內(nèi)存的高地址中。
下面我們來(lái)看一道題目:判斷當(dāng)前機(jī)器的存儲(chǔ)模式是大端存儲(chǔ)還是小端存儲(chǔ)。
#include <stdio.h> int check_sys() { int i = 1; return (*(char*)&i); //具體原因看下圖解釋 } int main() { int ret = check_sys(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
浮點(diǎn)型在內(nèi)存中的存儲(chǔ)
(-1)^S * M * 2^E
(-1)^s表示符號(hào)位,當(dāng)s=0,V為正數(shù);當(dāng)s=1,V為負(fù)數(shù)。
M表示有效數(shù)字,大于等于1,小于2。
2^E表示指數(shù)位。
例如 V=5.0 :浮點(diǎn)數(shù)存儲(chǔ)為 101.0
如果我們想算出S、M、E,那么小數(shù)點(diǎn)前面就只能有一位
例: V=9.5=1001.1=1.0011*2^3
因此 S=0,M=1.0011,E=3
但是,凡是都有例外,因此,并不是所有的浮點(diǎn)數(shù)都可以用這種方式表示的
例如:V=9.6=1001.10…與1001.11之間徘徊,無(wú)法精確的表示出來(lái)
float —> 4byte —>32bit
double—>8byte—>64bit
雖然double類(lèi)型比f(wàn)loat類(lèi)型的精確度要大,但是他們依舊有可能無(wú)法將小數(shù)的內(nèi)存完整保存。
2、值得注意的是浮點(diǎn)數(shù)在內(nèi)存中使用S、M、E的形式來(lái)存儲(chǔ)的
對(duì)于32位的浮點(diǎn)數(shù),最高的1位是符號(hào)位s,
接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。
對(duì)于64位的浮點(diǎn)數(shù),最高的1位是符號(hào)位S,
接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M
3、指數(shù)E是一個(gè)復(fù)雜的數(shù)
首先 E 是一個(gè)無(wú)符號(hào)整數(shù)這意味著, 如果E為8位,它的取值范圍為0 ~ 255;如果E為11位,它的取值范圍為0~2047。 但是,我們知道,科學(xué)計(jì)數(shù)法中的E是可以出現(xiàn)負(fù)數(shù)的,所以,存入內(nèi)存時(shí)E的真實(shí)值必須再加上一個(gè)中間數(shù),對(duì)于8位的E,這個(gè)中間數(shù)是 127;對(duì)于11位的E,這個(gè)中間數(shù)是1023。比如,2^10的E是10,所以保存成32位浮點(diǎn)數(shù)時(shí),必須保存成10+127=137,即10001001。
如果有錯(cuò)誤,希望大家評(píng)論或者私信指正!
到此這篇關(guān)于C語(yǔ)言數(shù)據(jù)的存儲(chǔ)專(zhuān)項(xiàng)分析的文章就介紹到這了,更多相關(guān)C語(yǔ)言數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言數(shù)據(jù)在內(nèi)存中的存儲(chǔ)流程深入分析
- C語(yǔ)言大小端字節(jié)序存儲(chǔ)模式深入解讀
- C語(yǔ)言詳細(xì)分析不同類(lèi)型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)
- C語(yǔ)言中數(shù)據(jù)如何存儲(chǔ)進(jìn)內(nèi)存揭秘
- C語(yǔ)言深入分析整形數(shù)據(jù)存儲(chǔ)
- C語(yǔ)言數(shù)據(jù)存儲(chǔ)歸類(lèi)介紹
- C語(yǔ)言深入探索數(shù)據(jù)類(lèi)型的存儲(chǔ)
- 深入分析C語(yǔ)言存儲(chǔ)類(lèi)型與用戶(hù)空間內(nèi)部分布
相關(guān)文章
使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼
大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼2021-12-12C語(yǔ)言strlen和sizeof在數(shù)組中的使用詳解
對(duì)于 strlen 和 sizeof,相信不少程序員會(huì)混淆其功能。雖然從表面上看它們都可以求字符串的長(zhǎng)度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別2021-10-10C++實(shí)現(xiàn)紅黑樹(shù)應(yīng)用實(shí)例代碼
紅黑樹(shù)它一種特殊的二叉查找樹(shù),這意味著它滿(mǎn)足二叉查找樹(shù)的特征,但是也有許多自己的特性,這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)紅黑樹(shù)的相關(guān)資料,需要的朋友可以參考下2021-11-11C語(yǔ)言實(shí)現(xiàn)堆的簡(jiǎn)單操作的示例代碼
堆(heap)是計(jì)算機(jī)科學(xué)中一類(lèi)特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱(chēng)。堆通常是一個(gè)可以被看做一棵樹(shù)的數(shù)組對(duì)象。本文介紹了C語(yǔ)言中堆的一些簡(jiǎn)單操作,需要的可以參考一下2022-11-11用c語(yǔ)言實(shí)現(xiàn)一個(gè)電話(huà)薄(附完整代碼)
大家好,本篇文章主要講的是用c語(yǔ)言實(shí)現(xiàn)一個(gè)電話(huà)薄(附完整代碼),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2022-01-01C語(yǔ)言實(shí)現(xiàn)隨機(jī)生成6位數(shù)密碼
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單而實(shí)用的隨機(jī)密碼生成器,該生成器將生成包含字母、數(shù)字和特殊字符的隨機(jī)密碼,有需要的小伙伴可以參考下2023-11-11C++面經(jīng)之什么是RAII面試問(wèn)題解析
這篇文章主要介紹了C++面經(jīng)之什么是RAII面試問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了C語(yǔ)言進(jìn)度條的實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08