小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

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

有符號整型和無符號數(shù)整型

舉例

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

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

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

解析

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

有符號字符型和無符號字符型

舉例

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

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

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

解析

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

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

??舉個例子

#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行,按理來說應(yīng)該輸出1的,但是這里輸出的是4.因?yàn)?,進(jìn)行a和b都為char型,a+b時,會將a和b提升為int型計(jì)算,所以會輸出4。

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

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

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

有符號整型和無符號字符型

舉例

#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。

有符號字符型和無符號整型

舉例

#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ò)充符號位,相反需要截斷高位

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

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

結(jié)論

??1.無符號int與有符號int比較大小,都轉(zhuǎn)化為無符號int來比較。

??2.int類型與非無符號int的類型比較時,非無符號int的類型轉(zhuǎn)化為int來比較。

??3.無符號int類型與其他類型如unsigned short,signed short,unsigned char, char 比較時,其他類型一律轉(zhuǎn)化為無符號int類型來比較。

??4.非無符號int類型和非int類型如unsigned short,signed short,unsigned char, char 比較時,一律轉(zhuǎn)化為int類型來比較。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多