目錄
整型提升
間接證明整型提升的代碼案例
算術轉換?
整型提升
何為整型提升:
C語言的整型算術運算總是至少以缺省(默認)整型類型的精度來進行的
為了獲得這個精度,表達式中的字符類型和短整型操作數在使用之前被轉換為普通整型(int類型),這種傳喚就被稱為整型提升
整型提升的意義:
表達式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的操作數的字節長度-般就是int的字節長度,同時也是CPU的通用寄存器的長度
因此,即使兩個char類型或者short類型的相加,在CPU執行時實際上也要先轉換為CPU內整型操作數的標準長度
如何進行整型提升呢??
整型提升是按照變量的數據類型的符號位來提升的
當符號位是1時,整型提升時高位補全符號位1
當符號位是0時,整型提升時高位補全符號位0
代碼舉例:
#include<stdio.h>
int main()
{char c1 = 5;char c2 = 127;char c3 = c1 + c2;printf("%d\n", c3);return 0;
}
c3以%d的形式打印的結果為多少呢,以及c1和c2在相加時是如何整型提升的呢?
代碼分析:
常量5和17分別存儲在char類型的變量c1和c2中的補碼(char長度為1字節):
若常量的值大于了char類型能存放的最大值,就會發生截斷
c1和c2整型提升后的補碼(按符號位整型提升):
c1 + c2;??c1和c2整型提升后相加的補碼存放在c3中:
?
char c3 = c1 + c2;? c3是char類型變量,所以存放時會發生截斷:
printf("%d\n", c3);? ? ?%d是以十進制的形式打印有符號的整數
那么c3在以%d的形式打印時又會發生整型提升(按符號位整型提升):?
c3的二進制原碼轉換為十進制為:1*2^2 +?1*2^3?+?1*2^4?+?1*2^5?+?1*2^6 = 124
且c3的最高位(符號位)為1,所以c3以%d的形式打印的結果為:-124?
代碼驗證:?
注意:無符號的數據類型整型提升時,高位補全直接補0
間接證明整型提升的代碼案例
代碼案例1:
#include<stdio.h>
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;
}
0x --- 以0x開頭的數字表示這是一個十六進制的數字
十六進制中的b表示的是11,轉換為二進制為:1011
一個十六進制的數字表示4個bit
char a = 0xb6; ---?兩個十六進制的數字為8bit,剛好填滿char類型的a,且不會發生進位
short b = 0xb600; --- 四個十六進制的數字為16bit,剛好填滿short類型的b,且不會發生進位
當?if (a == 0xb6) 和?if(b==0xb600) 比較判斷時,就會發生算術運算,那么就必然會發生整型提升
所以 char類型的a 和 short類型的b 就會發生整型提升,a和b的最高位都是1,所以整型提升后的結果就會發生改變,自然判斷就不會全等
而int c = 0xb6000000;? ?int類型的c不會發生整型提升,所以判斷會全等,則打印的結果為c?
代碼驗證:
?代碼案例2:
#include<stdio.h>
int main()
{char c = 1;printf("%u\n", sizeof(c));printf("%u\n", sizeof(+c));printf("%u\n", sizeof(-c));return 0;
}
?%u --- 以十進制的形式打印無符號整數
sizeof(c):毫無疑問結果為1字節,以為c為char類型,char的長度為1字節
sizeof(+c) 和 sizeof(-c):正和負表示算術運算,只要cher類型和short類型的數據參與運算,就會發生整型提升,提升為int類型,所以sizeof(+c) 和 sizeof(-c)計算的結果為4
代碼驗證:?
算術轉換?
何為算術轉換?
如果某個操作符的各個操作數屬于不同的類型(只包括大于等于int類型的類型,也就是說大于等于4個字節),那么除非其中一個操作數的轉換為另一個操作數的類型(向上轉換,小的字節類型轉換為大的字節類型),否則操作就無法進行
舉例說明:?
double d = 3.14159;int n = 10;d + n;
當 double類型的d 和 int類型的n 算術運算時,就會把 int類型的n 向上轉換為 double類型?再進行運算
注意:只是在運算時把?int類型的n 向上轉換為 double類型?,并不會改變n的類型