重學(xué)c/c++之?dāng)?shù)據(jù)存儲(chǔ)詳解(整數(shù)、浮點(diǎn)數(shù))
一:整形
正常情況下
正數(shù)在內(nèi)存中的存儲(chǔ)為補(bǔ)碼。
char a=30;
00011110(計(jì)算機(jī)中的存儲(chǔ))
負(fù)數(shù)在內(nèi)存中的存儲(chǔ)為補(bǔ)碼。
char a=-30;
10011110(原碼)
11100001(反碼)
11111011(計(jì)算機(jī)中的存儲(chǔ))
注意的是當(dāng)數(shù)據(jù)存在溢出的時(shí)候,會(huì)變成負(fù)數(shù),如下圖。
int main() {
char a=130;
printf("%d",a);// -126
}
分析
10000010(計(jì)算機(jī)中的存儲(chǔ))
特殊情況下
有符號(hào)
unsigned char c=-1;
解釋
10000001(機(jī)器碼)
111111110(反碼)
111111111(補(bǔ)碼,由于是無(wú)符號(hào),符號(hào)變0,即01111111)
char c=-2;//4294967294
10000000 00000000 00000000 00000010(機(jī)器碼)
11111111 11111111 11111111 11111101(反碼)
11111111 11111111 11111111 11111110 (補(bǔ)碼,由于輸出的是無(wú)符號(hào)位,所以直接輸出,不需要轉(zhuǎn)化)
數(shù)據(jù)溢出()
正數(shù)(負(fù)數(shù))
char a=129;
printf("%d",a);//-127
解釋
1000 0001(首先,會(huì)把129的機(jī)器碼作為補(bǔ)碼存儲(chǔ)在內(nèi)存中)
1111 1111(減一求反得到原碼,然后輸出)
如果只有最高位為負(fù)數(shù),則直接加負(fù)號(hào)
char a=-130;
解釋
1000 0010(首先,會(huì)把-130的機(jī)器碼作為補(bǔ)碼存儲(chǔ)在內(nèi)存中)
1000 0001(減一)
0111 1110 2+4+8+16+32+64=126 (得到原碼)
補(bǔ)充
大端存儲(chǔ):數(shù)據(jù)的低位保存在內(nèi)存的高位中,而數(shù)據(jù)的高位保存在內(nèi)存大地位中。
小端存儲(chǔ):數(shù)據(jù)的低位保存在內(nèi)存的高位中,而數(shù)據(jù)的高位保存在內(nèi)存大地位中。
//設(shè)計(jì)一個(gè)小程序來(lái)判斷當(dāng)前機(jī)器的字節(jié)序
Bool checkSys(){
int a=1;
return (*(char *)&i);
}
二:浮點(diǎn)型
根據(jù)國(guó)際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會(huì)) 754,任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式:
(-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ù)。
注:
1、這里的有效數(shù)字范圍是[1,2),可類(lèi)比十進(jìn)制中有效數(shù)字的范圍是[1,10)。
2、指數(shù)部分以2為底數(shù),類(lèi)比十進(jìn)制中指數(shù)部分以10為底數(shù)。
例如十進(jìn)制中的5.0,寫(xiě)成二進(jìn)制浮點(diǎn)數(shù)是101.0,用該形式表示就是(-1) ^ 0 * 1.01 * 2 ^ 2
(其中S = 0, M = 1.01, E = 2)
又如十進(jìn)制中的-5.5,寫(xiě)成二進(jìn)制浮點(diǎn)數(shù)是101.1(此處小數(shù)點(diǎn)后的第一位權(quán)重是2 ^(-1),也就是0.5,所以此處是1),用該形式表示就是(-1) ^ 1 * 1.011 * 2 ^ 2
(其中S = 1, M = 1.011, E = 2)

E全為0時(shí)
由于E加上后127為全0,也就是說(shuō)E的真實(shí)值為-127,即該浮點(diǎn)數(shù)指數(shù)部分是2 ^ (-127),顯然這是一個(gè)極小的數(shù),此時(shí)有效數(shù)字M不再加上第一位的1,而是還原為以0為整數(shù)的小數(shù)。這樣做是為了表示±0,以及接近于0的很小的數(shù)字。
E全為1時(shí)
由于E加上后127為全1,也就是說(shuō)E的真實(shí)值為128,即該浮點(diǎn)數(shù)指數(shù)部分是2 ^ (128),顯然這是一個(gè)極大的數(shù),此時(shí)表示正負(fù)無(wú)窮大(正負(fù)號(hào)由S決定)
中以32位浮點(diǎn)數(shù)為例,64位浮點(diǎn)數(shù)同理
總結(jié)
到此這篇關(guān)于重學(xué)c/c++之?dāng)?shù)據(jù)存儲(chǔ)的文章就介紹到這了,更多相關(guān)c/c++數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++超詳細(xì)講解貪心策略的設(shè)計(jì)及解決會(huì)場(chǎng)安排問(wèn)題
為了更好的應(yīng)對(duì)《算法設(shè)計(jì)與分析》這門(mén)課程,我把書(shū)上以及老師講過(guò)的案例都詳細(xì)的做一個(gè)重現(xiàn)及解剖,讓你熟記每一個(gè)潛在的考點(diǎn),希望能給大家?guī)椭?/div> 2022-05-05
解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法
本篇文章是對(duì)Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
ros項(xiàng)目調(diào)試:vscode下配置開(kāi)發(fā)ROS項(xiàng)目的詳細(xì)教程
這篇文章主要介紹了ros項(xiàng)目調(diào)試:vscode下配置開(kāi)發(fā)ROS項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
C++LeetCode數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode數(shù)據(jù)結(jié)構(gòu),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
詳解C語(yǔ)言中sizeof如何在自定義函數(shù)中正常工作
在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細(xì)講解一下如何解決這一問(wèn)題,感興趣的可以了解一下2022-05-05
詳解C語(yǔ)言內(nèi)核字符串轉(zhuǎn)換方法
在內(nèi)核開(kāi)發(fā)模式下,初始化字符串也需要調(diào)用專用的初始化函數(shù),如下分別初始化ANSI和UNCODE字符串,本文我們就來(lái)看看代碼是如何實(shí)現(xiàn)的2022-09-09
C# 使用反射來(lái)實(shí)現(xiàn)對(duì)象的深度復(fù)制方法
下面小編就為大家?guī)?lái)一篇C# 使用反射來(lái)實(shí)現(xiàn)對(duì)象的深度復(fù)制方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01最新評(píng)論

