C語言整形提升舉例詳解
1.什么是整形提升
表達(dá)式中的字符和短整形操作數(shù)在使用之前被轉(zhuǎn)換成普通整形
int,這種轉(zhuǎn)換叫做整形提升
整形提升針對的類型小于整形的
char,short
char占用1字節(jié)空間,short占用2字節(jié)空間,在運(yùn)算時都會提升為占用4個字節(jié)的int類型
所以C的整型算術(shù)運(yùn)算總是至少以缺省整型類型的精度來進(jìn)行的。換而言之整形算術(shù)運(yùn)算都至少以int類型計算的
2.為什么會有整形提升
表達(dá)式的整形運(yùn)算要在CPU的相應(yīng)運(yùn)算器內(nèi)執(zhí)行,CPU內(nèi)整型運(yùn)算器(ALU)的操作數(shù)的字節(jié)長度一般就是int的字節(jié)長度,同時也是CPU的通用寄存器的長度。
通用CPU(general-purpose CPU)是難以直接實(shí)現(xiàn)兩個8比特字節(jié)直接相加運(yùn)算(雖然機(jī)器指令中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長度可能小于int長度的整型值,都必須先轉(zhuǎn)換為int或unsigned int,然后才能送入CPU去執(zhí)行運(yùn)算。
因此,即使兩個char類型的變量相加,在·CPU執(zhí)行時實(shí)際上也要先轉(zhuǎn)化為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長速度。
3.如何進(jìn)行整形提升呢?
整形提升是按照變量的數(shù)據(jù)類型的符號位來提升的
負(fù)數(shù)的整形提升:
char c1 = -1,char類型占1字節(jié),也就是它的二進(jìn)制補(bǔ)碼只有8個比特位 :1111111
因為char是有符號位的char,所以整形提升的時候,高位補(bǔ)符號位1
提升之后的效果為:11111111111111111111111111111111
正數(shù)的整形提升:
char c2 = 1;
變量c2的二進(jìn)制位(補(bǔ)碼)中只有8個比特位:00000001
因為char為有符號的char
所以整形提升的時候,高位補(bǔ)充符號位,即為0
提升之后的結(jié)果是:00000000000000000000000000000001
無符號的整形提升:高位補(bǔ)0
4.整形提升的例子
例1
#include<stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d\n", c);
return 0;
}
char a = 3,首先把3放到a中,3是int類型,3的二進(jìn)制序列為:00000000000000000000000000000011
需要把3放到char中,int是32個比特位,char是8個比特位,所以接下來需要進(jìn)行截斷:將低8個比特位放到char中,所以此時a中為:00000011
char b = 127也是一樣127為00000000000000000000000001111111
截斷為011111111
char c = a + b,接下來要進(jìn)行整型提升
當(dāng)前char為有符號的char,所以對于a就高位補(bǔ)0,為:00000000000000000000000000000011
同理,b整形提升后為:00000000000000000000000001111111
接下來相加為
00000000000000000000000010000010,將這個32位二進(jìn)制放到c中,截斷為10000010
printf("%d\n", c)中,%d是打印十進(jìn)制的數(shù),所以還需整形提升,此時c為10000010,符號位為:1,整形提升高位補(bǔ)1,最終為11111111111111111111111110000010(補(bǔ)碼),其原碼為10000000000000000000000001111110,所以這個數(shù)字輸出為-126
輸出結(jié)果:

例2
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
比較也是表達(dá)式,
a,b也要發(fā)生整形提升,所以只有c不會整形提升,所以輸為c
輸出結(jié)果

這個例子能體現(xiàn)整形提升的存在
例3
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
c是char類型,sizeof(c)值為1+c.-c中,c都參與計算,所以整形提升為int類型,sizeof(+c),sizeof(-c)值都為4
輸出結(jié)果:

這個例子也能體現(xiàn)整形提升的存在
例4
下面程序輸出什么?
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
- 10000000000000000000000010000000 -128原碼
- 11111111111111111111111101111111 -128反碼
- 11111111111111111111111110000000 -128補(bǔ)碼
- 截斷 10000000 a
- 整形提升11111111111111111111111110000000
- 所以最后輸出11111111111111111111111110000000對應(yīng)的十進(jìn)制數(shù),是一個很大的數(shù)
例5
下面程序輸出什么?
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
10000000000000000000000010000000128補(bǔ)碼- 截斷:
10000000a補(bǔ)碼 - 整形提升:
11111111111111111111111110000000 - 所以最后輸出
11111111111111111111111110000000對應(yīng)的數(shù),一個很大的數(shù)
整形提升是真實(shí)存在的,但是我們平時感覺不到他的存在
其他操作符如int,float,double等大于等于int的操作符,之間的轉(zhuǎn)換,就要用到算術(shù)轉(zhuǎn)換了
總結(jié)
到此這篇關(guān)于C語言整形提升的文章就介紹到這了,更多相關(guān)C語言整形提升內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C C++算法題解LeetCode1408數(shù)組中的字符串匹配
這篇文章主要為大家介紹了C C++算法題解LeetCode1408數(shù)組中的字符串匹配示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
C語言實(shí)現(xiàn)旅游景點(diǎn)咨詢系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)旅游景點(diǎn)咨詢系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12
利用C語言實(shí)現(xiàn)順序表的實(shí)例操作
順序表是線性表中的一種重要的數(shù)據(jù)結(jié)構(gòu),也是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),所以他不僅是學(xué)習(xí)中的重點(diǎn),也是應(yīng)用開發(fā)非常常用的一種數(shù)據(jù)結(jié)構(gòu)。這篇文章介紹如何利用C語言實(shí)現(xiàn)順序表。2016-08-08
C++中四種對象生存期和作用域以及static的用法總結(jié)分析
以下是對C++中四種對象生存期和作用域以及static的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-09-09

