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

E全為0時
由于E加上后127為全0,也就是說E的真實值為-127,即該浮點數(shù)指數(shù)部分是2 ^ (-127),顯然這是一個極小的數(shù),此時有效數(shù)字M不再加上第一位的1,而是還原為以0為整數(shù)的小數(shù)。這樣做是為了表示±0,以及接近于0的很小的數(shù)字。
E全為1時
由于E加上后127為全1,也就是說E的真實值為128,即該浮點數(shù)指數(shù)部分是2 ^ (128),顯然這是一個極大的數(shù),此時表示正負無窮大(正負號由S決定)
中以32位浮點數(shù)為例,64位浮點數(shù)同理
總結
到此這篇關于重學c/c++之數(shù)據(jù)存儲的文章就介紹到這了,更多相關c/c++數(shù)據(jù)存儲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解
本篇文章是對利用ace的ACE_Task等類實現(xiàn)線程池的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C++實現(xiàn)LeetCode(173.二叉搜索樹迭代器)
這篇文章主要介紹了C++實現(xiàn)LeetCode(173.二叉搜索樹迭代器),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08
Visual?Studio?2022下載安裝與使用超詳細教程
這篇文章主要介紹了Visual?Studio?2022最新版安裝與使用教程,本文以社區(qū)版為例通過圖文并茂的形式給大家介紹Visual?Studio?2022安裝使用,需要的朋友可以參考下2022-04-04

