前幾天在學習交流群里,有個小伙伴問了一個問題,是關于有符號整數和無符號字符數的運算的問題,對于這部分,我個人理解的也有點問題,現在來做個總結回顧,
有符號整型和無符號數整型
舉例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = -1;
unsigned int b = 1;
printf("%d", a > b);
return 0;
}
??輸出結果為:1
決議
??無符號整型和有符號整型比較時,有符號整型會轉化成無符號整型,因此,-1轉化為無符號數為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;
}
??輸出結果:0
決議
??要解釋以上這個現象,首先要明白整型提升:
??整型提升是C程式設計語言中的一項規定:在運算式計算時,各種整形首先要提升為int型別,如果int型別不足以表示則要提升為unsigned int型別;然后執行運算式的運算,
??整型提升的意義在于:運算式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的運算元的位元組長度一般就是int的位元組長度,同時也是CPU的通用暫存器的長度,因此,即使兩個char型別的相加,在CPU執行時實際上也要先轉換為CPU內整型運算元的標準長度,通用CPU(general-purpose CPU)是難以直接實作兩個8位元位元組直接相加運算(雖然機器指令中可能有這種位元組相加指令),所以,運算式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執行運算,(來源百度百科)
??舉個例子
#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;
}
??輸出結果為:4 d 1,
??第8行,按理來說應該輸出1的,但是這里輸出的是4.因為,進行a和b都為char型,a+b時,會將a和b提升為int型計算,所以會輸出4,
??第11行,c為char型,計算a+b時,其實是先提升為int型,再轉換為char型賦值給c,進行了兩次型別轉換,所以,printf時,c是char型,輸出d(ASCII:100)
??同樣的,第12行輸出的就是1,
??接下來回到本題中,a = -1,提升為int型為-1,b = 1,提升為int型為1,所以結果為0,
有符號整型和無符號字符型
舉例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = -1;
unsigned char b = -1;
printf("%d", a > b);
return 0;
}
??輸出結果為:0,
決議
??整型提升,b轉化為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;
}
輸出結果:1,
決議
??char型別被擴展為unsigned int后與b相等,同為0xFFFFFFFF
-1原始碼:1000 0001
-1補碼:1111 1111
擴展: 1111 11111111 1111(占用位元組小的資料賦值給占用位元組大的需要擴充符號位,相反需要截斷高位)
轉為unsigned int:0xFFFF FFFF
轉為int: 求擴展后的原始碼,還需要-1,除去符號位,取反,因此結果為:1000 0000 0000 0001 = -1,
結論
??1.無符號int與有符號int比較大小,都轉化為無符號int來比較,
??2.int型別與非無符號int的型別比較時,非無符號int的型別轉化為int來比較,
??3.無符號int型別與其他型別如unsigned short,signed short,unsigned char, char 比較時,其他型別一律轉化為無符號int型別來比較,
??4.非無符號int型別和非int型別如unsigned short,signed short,unsigned char, char 比較時,一律轉化為int型別來比較,
??養成習慣,先贊后看!如果覺得寫的不錯,歡迎關注,點贊,在看,轉發,謝謝!
如遇到排版錯亂的問題,可以通過以下鏈接訪問我的CSDN,
CSDN:CSDN搜索“嵌入式與Linux那些事”
歡迎歡迎關注我的公眾號:嵌入式與Linux那些事,領取秋招筆試面試大禮包(華為小米等大廠面經,嵌入式知識點總結,筆試題目,簡歷模版等)和2000G學習資料,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/235169.html
標籤:嵌入式
