前言:學習了C語言中的整型提升,總是感覺聽的時候很明白,但當自己做題的時候,又總是遺漏了哪一步。自己的感悟:整型提升步驟以及原理都一樣,就是把步驟記清楚一步一步的來就行。因此通過下面的一道題來每日復習。
前景回顧:
整型提升:一個表達式中的操作數大小達不到一個整型類型大小的時候需要整型提
升。
下面將對代碼進行逐行分析,達到抽絲剝繭的效果。
上代碼:
#include <stdio.h>
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf("%d %d", a + b, c);
return 0;
}
輸出:
分析
1、unsigned char a = 200;
變量a是200,200是個正數,所以a的原碼,反碼,反碼相同:
00000000000000000000000011001000
【重點:】這里需要對a進行截斷。
因為a是char類型的數據,只能存放8個bit位的數字。而00000000000000000000000011001000現在是32bit位的數字。所以只截斷后8bit位的二進制數。
所以截斷后:11001000
同理:
2、unsigned char b = 100;
變量b是100,100是個正數,所以b的原碼,反碼,反碼相同:
00000000000000000000000001100100
同理截斷后為:01100100
3、c = a + b;
首先看到需要a+b了。
a和b現在是未滿足一個整型數據大小的,所以需要整型提升。
【重點】:整型提升是按照變量的數據類型的符號位來提升的。
記住一句話:對那個變量進行整型提升,就先看這個變量的數據類型。
這里分兩種情況:
- 如果該變量是無符號類型的,高位是有效位,全部補充0即可。
- 如果該變量是有符號類型的,高位是符號位,需要全部填充符號位。
那現在a、b都是unsigned char,說明都是無符號類型,所以只需要高位只需要全部補充未0即可。(一直補充道32bit位)。
所以:
- a整型提升后的結果:00000000000000000000000011001000
- b整型提升后的結果:00000000000000000000000001100100
然后a+b的結果就是:00000000000000000000000100101100
因為變量c也是char類型的數據,所以還需要截斷,c存儲的就是:00101100。
4、printf(“%d %d”, a + b, c);
可以看到,a+b、c都是以%d的形式打印,所以打印前還需要整型提升。
c現在存儲:00101100,c是unsigned char 無符號類型的,高位是有效位,全部用0填充即可。
所以c整型提升后的結果就是:00000000000000000000000000101100。
然后打印c,打印需要根據原碼打印,現在00000000000000000000000000101100數補碼,但是c是無符號類型的,并且c的高位是0,0表示正數,正數的原碼=反碼=補碼。
所以c的結果轉為十進制就是44。文章來源:http://www.zghlxwxcb.cn/news/detail-499061.html
之后再來看a+b的結果,現在a+b的結果并沒有存在c變量中。
上面說了a+b的結果是:00000000000000000000000100101100,高位也是0,0表示正數,正數的原碼=反碼=補碼。所以直接將此二進制轉為十進制的結果就是:300。文章來源地址http://www.zghlxwxcb.cn/news/detail-499061.html
到了這里,關于C語言數據在內存中存儲---整型提升練習的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!