最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言整形提升舉例詳解

 更新時(shí)間:2023年01月09日 11:15:55   作者:Jambo!  
對(duì)于整形提升,高位需要補(bǔ)位,那么補(bǔ)什么呢,無符號(hào)數(shù)高位補(bǔ)0,有符號(hào)數(shù)高位補(bǔ)1,下面這篇文章主要給大家介紹了關(guān)于C語言整形提升的相關(guān)資料,需要的朋友可以參考下

1.什么是整形提升

表達(dá)式中的字符和短整形操作數(shù)在使用之前被轉(zhuǎn)換成普通整形int,這種轉(zhuǎn)換叫做整形提升

整形提升針對(duì)的類型小于整形的char,short

char占用1字節(jié)空間,short占用2字節(jié)空間,在運(yùn)算時(shí)都會(huì)提升為占用4個(gè)字節(jié)的int類型

所以C的整型算術(shù)運(yùn)算總是至少以缺省整型類型的精度來進(jìn)行的。換而言之整形算術(shù)運(yùn)算都至少以int類型計(jì)算的

2.為什么會(huì)有整形提升

表達(dá)式的整形運(yùn)算要在CPU的相應(yīng)運(yùn)算器內(nèi)執(zhí)行,CPU內(nèi)整型運(yùn)算器(ALU)的操作數(shù)的字節(jié)長度一般就是int的字節(jié)長度,同時(shí)也是CPU的通用寄存器的長度。

通用CPU(general-purpose CPU)是難以直接實(shí)現(xiàn)兩個(gè)8比特字節(jié)直接相加運(yùn)算(雖然機(jī)器指令中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長度可能小于int長度的整型值,都必須先轉(zhuǎn)換為int或unsigned int,然后才能送入CPU去執(zhí)行運(yùn)算。

因此,即使兩個(gè)char類型的變量相加,在·CPU執(zhí)行時(shí)實(shí)際上也要先轉(zhuǎn)化為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長速度。

3.如何進(jìn)行整形提升呢?

整形提升是按照變量的數(shù)據(jù)類型的符號(hào)位來提升的

負(fù)數(shù)的整形提升:

char c1 = -1,char類型占1字節(jié),也就是它的二進(jìn)制補(bǔ)碼只有8個(gè)比特位 :1111111
因?yàn)?code>char是有符號(hào)位的char,所以整形提升的時(shí)候,高位補(bǔ)符號(hào)位1
提升之后的效果為:11111111111111111111111111111111

正數(shù)的整形提升:

char c2 = 1;
變量c2的二進(jìn)制位(補(bǔ)碼)中只有8個(gè)比特位:
00000001
因?yàn)?char 為有符號(hào)的 char
所以整形提升的時(shí)候,高位補(bǔ)充符號(hào)位,即為0
提升之后的結(jié)果是:
00000000000000000000000000000001

無符號(hào)的整形提升:高位補(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個(gè)比特位,char是8個(gè)比特位,所以接下來需要進(jìn)行截?cái)啵簩⒌?個(gè)比特位放到char中,所以此時(shí)a中為: 00000011

char b = 127也是一樣
12700000000000000000000000001111111
截?cái)酁?code>011111111

char c = a + b,接下來要進(jìn)行整型提升
當(dāng)前char為有符號(hào)的char,所以對(duì)于a就高位補(bǔ)0,為:00000000000000000000000000000011
同理,b整形提升后為:00000000000000000000000001111111

接下來相加為00000000000000000000000010000010,將這個(gè)32位二進(jìn)制放到c中,截?cái)酁?code>10000010

printf("%d\n", c)中,%d是打印十進(jìn)制的數(shù),所以還需整形提升,此時(shí)c10000010,符號(hào)位為:1,整形提升高位補(bǔ)1,最終為11111111111111111111111110000010(補(bǔ)碼),其原碼為10000000000000000000000001111110 ,所以這個(gè)數(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不會(huì)整形提升,所以輸為c

輸出結(jié)果

這個(gè)例子能體現(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;
}

cchar類型,sizeof(c)值為1
+c.-c中,c都參與計(jì)算,所以整形提升為int類型,sizeof(+c),sizeof(-c)值都為4

輸出結(jié)果:

請(qǐng)?zhí)砑訄D片描述

這個(gè)例子也能體現(xiàn)整形提升的存在

例4

下面程序輸出什么?

#include <stdio.h>
int main()
{
  char a = -128;
  printf("%u\n",a);
  return 0;
}
  • 10000000000000000000000010000000 -128原碼
  • 11111111111111111111111101111111 -128反碼
  • 11111111111111111111111110000000 -128補(bǔ)碼
  • 截?cái)?10000000 a
  • 整形提升11111111111111111111111110000000
  • 所以最后輸出11111111111111111111111110000000對(duì)應(yīng)的十進(jìn)制數(shù),是一個(gè)很大的數(shù)

例5

下面程序輸出什么?

#include <stdio.h>
int main()
{
  char a = 128;
  printf("%u\n",a);
  return 0;
}
  • 10000000000000000000000010000000 128補(bǔ)碼
  • 截?cái)啵?code>10000000 a補(bǔ)碼
  • 整形提升:11111111111111111111111110000000
  • 所以最后輸出11111111111111111111111110000000對(duì)應(yīng)的數(shù),一個(gè)很大的數(shù)

整形提升是真實(shí)存在的,但是我們平時(shí)感覺不到他的存在

其他操作符如int,float,double等大于等于int的操作符,之間的轉(zhuǎn)換,就要用到算術(shù)轉(zhuǎn)換了

總結(jié)

到此這篇關(guān)于C語言整形提升的文章就介紹到這了,更多相關(guān)C語言整形提升內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++簡單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    C++簡單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡稱,它允許程序調(diào)用運(yùn)行在另一臺(tái)計(jì)算機(jī)上的過程,就像調(diào)用本地的過程一樣。本文將用C++簡單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊,感興趣的可以了解一下
    2023-04-04
  • C語言 如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù)

    C語言 如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù)

    這篇文章主要介紹了C語言中如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • c++引用傳參和指針傳參的區(qū)別及說明

    c++引用傳參和指針傳參的區(qū)別及說明

    這篇文章主要介紹了c++引用傳參和指針傳參的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • c++如何實(shí)現(xiàn)跳表(skiplist)

    c++如何實(shí)現(xiàn)跳表(skiplist)

    這篇文章主要介紹了c++如何實(shí)現(xiàn)跳表,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • 原碼, 反碼與補(bǔ)碼基礎(chǔ)知識(shí)詳細(xì)介紹

    原碼, 反碼與補(bǔ)碼基礎(chǔ)知識(shí)詳細(xì)介紹

    這篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)碼. 并且進(jìn)行了深入探求了為何要使用反碼和補(bǔ)碼, 以及更進(jìn)一步的論證了為何可以用反碼, 補(bǔ)碼的加法計(jì)算原碼的減法,需要的朋友可以參考下
    2016-12-12
  • 簡易Dota改鍵程序制作

    簡易Dota改鍵程序制作

    利用全局鉤子制作一個(gè)個(gè)性化的dota游戲改鍵功能,大家可以參考使用
    2013-11-11
  • 用c語言實(shí)現(xiàn)和平精英的完整代碼

    用c語言實(shí)現(xiàn)和平精英的完整代碼

    這篇文章主要介紹了用c語言實(shí)現(xiàn)和平精英的完整代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 詳解C++中移動(dòng)語義的概念與使用

    詳解C++中移動(dòng)語義的概念與使用

    本篇文章主要為大家詳細(xì)介紹了C++中移動(dòng)語義的相關(guān)知識(shí),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧
    2023-06-06
  • 淺談c++11閉包的實(shí)現(xiàn)

    淺談c++11閉包的實(shí)現(xiàn)

    閉包有很多種定義,一種說法是,閉包是帶有上下文的函數(shù)。說白了,就是有狀態(tài)的函數(shù)。更直接一些,不就是個(gè)類嗎?換了個(gè)名字而已。本文將介紹c++11閉包的實(shí)現(xiàn),感興趣的同學(xué),可以參考下。
    2021-06-06
  • C語言基礎(chǔ)文件操作方式超全詳解建議收藏

    C語言基礎(chǔ)文件操作方式超全詳解建議收藏

    這篇文章主要為大家介紹了關(guān)于C語言文件操作方式的詳細(xì)總結(jié),建議收藏隨用隨看,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論

大埔县| 志丹县| 玉门市| 灵石县| 平原县| 余庆县| 贡山| 穆棱市| 斗六市| 鄂伦春自治旗| 秦皇岛市| 江门市| 毕节市| 玛曲县| 泰顺县| 固始县| 长葛市| 大同市| 根河市| 九龙城区| 西畴县| 若尔盖县| 辽中县| 澄迈县| 灌南县| 峨边| 渭源县| 黄浦区| 灵台县| 商城县| 元氏县| 营山县| 信宜市| 焉耆| 九龙坡区| 长宁县| 大连市| 德清县| 甘洛县| 乌苏市| 莫力|