日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

重學c/c++之數據存儲詳解(整數、浮點數)_C 語言

作者:Not?Talk ? 更新時間: 2022-12-09 編程語言

一:整形

正常情況下

正數在內存中的存儲為補碼。

char a=30;

00011110(計算機中的存儲)

負數在內存中的存儲為補碼。

char a=-30;

10011110(原碼)
11100001(反碼)
11111011(計算機中的存儲)

注意的是當數據存在溢出的時候,會變成負數,如下圖。

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 (補碼,由于輸出的是無符號位,所以直接輸出,不需要轉化)

數據溢出()

正數(負數)

 char a=129;
 printf("%d",a);//-127

解釋

1000 0001(首先,會把129的機器碼作為補碼存儲在內存中)
1111 1111(減一求反得到原碼,然后輸出)
如果只有最高位為負數,則直接加負號

char a=-130;

解釋

1000 0010(首先,會把-130的機器碼作為補碼存儲在內存中)
1000 0001(減一)
0111 1110 2+4+8+16+32+64=126 (得到原碼)

補充

大端存儲:數據的低位保存在內存的高位中,而數據的高位保存在內存大地位中。
小端存儲:數據的低位保存在內存的高位中,而數據的高位保存在內存大地位中。

//設計一個小程序來判斷當前機器的字節序
Bool checkSys(){
int a=1;
return (*(char *)&i);
}

二:浮點型

根據國際標準IEEE(電氣和電子工程協會) 754,任意一個二進制浮點數V可以表示成下面的形式:

(-1) ^ S * M * 2 ^ E

其中:

  • (-1) ^ S 表示符號位,當S=0,V為正數;當S=1,V為負數。
  • M 表示有效數字,大于等于1,小于2。
  • 2 ^ E 表示指數。

注:

1、這里的有效數字范圍是[1,2),可類比十進制中有效數字的范圍是[1,10)。

2、指數部分以2為底數,類比十進制中指數部分以10為底數。

例如十進制中的5.0,寫成二進制浮點數是101.0,用該形式表示就是(-1) ^ 0 * 1.01 * 2 ^ 2
(其中S = 0, M = 1.01, E = 2)

又如十進制中的-5.5,寫成二進制浮點數是101.1(此處小數點后的第一位權重是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,即該浮點數指數部分是2 ^ (-127),顯然這是一個極小的數,此時有效數字M不再加上第一位的1,而是還原為以0為整數的小數。這樣做是為了表示±0,以及接近于0的很小的數字。

E全為1時

由于E加上后127為全1,也就是說E的真實值為128,即該浮點數指數部分是2 ^ (128),顯然這是一個極大的數,此時表示正負無窮大(正負號由S決定)

中以32位浮點數為例,64位浮點數同理

總結

原文鏈接:https://blog.csdn.net/qq_39109805/article/details/127619960

欄目分類
最近更新