乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

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

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

      有符號(hào)整型和無符號(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

      解析

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

      有符號(hào)字符型和無符號(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ì)語言中的一項(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é)長度一般就是int的字節(jié)長度,同時(shí)也是CPU的通用寄存器的長度。因此,即使兩個(gè)char類型的相加,在CPU執(zhí)行時(shí)實(shí)際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長度。通用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è)例子

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

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

      有符號(hào)整型和無符號(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)字符型和無符號(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.無符號(hào)int與有符號(hào)int比較大小,都轉(zhuǎn)化為無符號(hào)int來比較。

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

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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(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)論公約

        類似文章 更多