重學(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ǔ))
特殊情況下
有符號
unsigned char c=-1;
解釋
10000001(機(jī)器碼)
111111110(反碼)
111111111(補(bǔ)碼,由于是無符號,符號變0,即01111111)
char c=-2;//4294967294
10000000 00000000 00000000 00000010(機(jī)器碼)
11111111 11111111 11111111 11111101(反碼)
11111111 11111111 11111111 11111110 (補(bǔ)碼,由于輸出的是無符號位,所以直接輸出,不需要轉(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ù)號
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è)小程序來判斷當(dāng)前機(jī)器的字節(jié)序 Bool checkSys(){ int a=1; return (*(char *)&i); }
二:浮點(diǎn)型
根據(jù)國際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會(huì)) 754,任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式:
(-1) ^ S * M * 2 ^ E
其中:
- (-1) ^ S 表示符號位,當(dāng)S=0,V為正數(shù);當(dāng)S=1,V為負(fù)數(shù)。
- M 表示有效數(shù)字,大于等于1,小于2。
- 2 ^ E 表示指數(shù)。
注:
1、這里的有效數(shù)字范圍是[1,2),可類比十進(jìn)制中有效數(shù)字的范圍是[1,10)。
2、指數(shù)部分以2為底數(shù),類比十進(jìn)制中指數(shù)部分以10為底數(shù)。
例如十進(jìn)制中的5.0,寫成二進(jìn)制浮點(diǎn)數(shù)是101.0,用該形式表示就是(-1) ^ 0 * 1.01 * 2 ^ 2
(其中S = 0, M = 1.01, E = 2)
又如十進(jìn)制中的-5.5,寫成二進(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,也就是說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,也就是說E的真實(shí)值為128,即該浮點(diǎn)數(shù)指數(shù)部分是2 ^ (128),顯然這是一個(gè)極大的數(shù),此時(shí)表示正負(fù)無窮大(正負(fù)號由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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法詳解
本篇文章是對利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ 關(guān)于MFC多線程編程的注意事項(xiàng)
這篇文章主要介紹了C++ 關(guān)于MFC多線程編程的注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2015-06-06C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹迭代器)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(173.二叉搜索樹迭代器),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Visual?Studio?2022下載安裝與使用超詳細(xì)教程
這篇文章主要介紹了Visual?Studio?2022最新版安裝與使用教程,本文以社區(qū)版為例通過圖文并茂的形式給大家介紹Visual?Studio?2022安裝使用,需要的朋友可以參考下2022-04-04