日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

不同類型數(shù)據(jù)運(yùn)算的總結(jié)

 行者花雕 2022-05-19 發(fā)布于北京

前幾天在學(xué)習(xí)交流群里,有個(gè)小伙伴問(wèn)了一個(gè)問(wèn)題,是關(guān)于有符號(hào)整數(shù)和無(wú)符號(hào)字符數(shù)的運(yùn)算的問(wèn)題。對(duì)于這部分,我個(gè)人理解的也有點(diǎn)問(wèn)題,現(xiàn)在來(lái)做個(gè)總結(jié)回顧。

有符號(hào)整型和無(wú)符號(hào)數(shù)整型

舉例

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = -1;
    unsigned int b = 1;
    printf("%d", a > b);
    return 0;
}

??輸出結(jié)果為:1

解析

??無(wú)符號(hào)整型和有符號(hào)整型比較時(shí),有符號(hào)整型會(huì)轉(zhuǎn)化成無(wú)符號(hào)整型。因此,-1轉(zhuǎn)化為無(wú)符號(hào)數(shù)為0xFFFFFFFF,所以a>b,輸出1。

有符號(hào)字符型和無(wú)符號(hào)字符型

舉例

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a = -1;
    unsigned char b = 1;
    printf("%d", a > b);
    return 0;
}

??輸出結(jié)果:0

解析

??要解釋以上這個(gè)現(xiàn)象,首先要明白整型提升:

??整型提升是C程序設(shè)計(jì)語(yǔ)言中的一項(xiàng)規(guī)定:在表達(dá)式計(jì)算時(shí),各種整形首先要提升為int類型,如果int類型不足以表示則要提升為unsigned int類型;然后執(zhí)行表達(dá)式的運(yùn)算。

??整型提升的意義在于:表達(dá)式的整型運(yùn)算要在CPU的相應(yīng)運(yùn)算器件內(nèi)執(zhí)行,CPU內(nèi)整型運(yùn)算器(ALU)的操作數(shù)的字節(jié)長(zhǎng)度一般就是int的字節(jié)長(zhǎng)度,同時(shí)也是CPU的通用寄存器的長(zhǎng)度。因此,即使兩個(gè)char類型的相加,在CPU執(zhí)行時(shí)實(shí)際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長(zhǎng)度。通用CPU(general-purpose CPU)是難以直接實(shí)現(xiàn)兩個(gè)8比特字節(jié)直接相加運(yùn)算(雖然機(jī)器指令中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長(zhǎng)度可能小于int長(zhǎng)度的整型值,都必須先轉(zhuǎn)換為int或unsigned int,然后才能送入CPU去執(zhí)行運(yùn)算。(來(lái)源百度百科)

??舉個(gè)例子

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a = '2';
    char b = '2';
    printf("%d\r\n", sizeof(a+b));
    
    char c = a+b;
    printf("%c\r\n", c);
    printf("%d\r\n", sizeof(c));
    
    return 0;
}

??輸出結(jié)果為:4 d 1。

??第8行,按理來(lái)說(shuō)應(yīng)該輸出1的,但是這里輸出的是4.因?yàn)?,進(jìn)行a和b都為char型,a+b時(shí),會(huì)將a和b提升為int型計(jì)算,所以會(huì)輸出4。

??第11行,c為char型,計(jì)算a+b時(shí),其實(shí)是先提升為int型,再轉(zhuǎn)換為char型賦值給c,進(jìn)行了兩次類型轉(zhuǎn)換。所以,printf時(shí),c是char型,輸出d(ASCII:100)

??同樣的,第12行輸出的就是1。

??接下來(lái)回到本題中,a = -1,提升為int型為-1,b = 1,提升為int型為1,所以結(jié)果為0。

有符號(hào)整型和無(wú)符號(hào)字符型

舉例

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = -1;
    unsigned char b = -1;
    printf("%d", a > b);
    return 0;
}

??輸出結(jié)果為:0。

解析

??整型提升,b轉(zhuǎn)化為int型為0xFF,所以a<b。輸出0。

有符號(hào)字符型和無(wú)符號(hào)整型

舉例

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = -1;
	unsigned int b = -1;
	printf("%d\n", a == b);
    return 0;
}

輸出結(jié)果:1。

解析

??char類型被擴(kuò)展為unsigned int后與b相等,同為0xFFFFFFFF

-1源碼:1000 0001

-1補(bǔ)碼:1111 1111

擴(kuò)展: 1111 11111111 1111(占用字節(jié)小的數(shù)據(jù)賦值給占用字節(jié)大的需要擴(kuò)充符號(hào)位,相反需要截?cái)喔呶?/strong>)

轉(zhuǎn)為unsigned int:0xFFFF FFFF

轉(zhuǎn)為int: 求擴(kuò)展后的源碼,還需要-1,除去符號(hào)位,取反。因此結(jié)果為:1000 0000 0000 0001 = -1。

結(jié)論

??1.無(wú)符號(hào)int與有符號(hào)int比較大小,都轉(zhuǎn)化為無(wú)符號(hào)int來(lái)比較。

??2.int類型與非無(wú)符號(hào)int的類型比較時(shí),非無(wú)符號(hào)int的類型轉(zhuǎn)化為int來(lái)比較。

??3.無(wú)符號(hào)int類型與其他類型如unsigned short,signed short,unsigned char, char 比較時(shí),其他類型一律轉(zhuǎn)化為無(wú)符號(hào)int類型來(lái)比較。

??4.非無(wú)符號(hào)int類型和非int類型如unsigned short,signed short,unsigned char, char 比較時(shí),一律轉(zhuǎn)化為int類型來(lái)比較。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多