在C語言中,很多情況會進行隱式的算術類型轉換。一般來說,如果二元運算符的兩個操作數具有不同的類型,那麼在進行運算之前先要把“較低”的類型提升爲“較高”的類型。運算的結果爲較高的類型。轉換規則:
首先,如果任何一個操作數爲long double類型,則將另一個操作數轉換爲long double 類型。
否則,如果任何一個操作數爲double類型,則將另一個操作數轉換爲double類型。
否則,如果任何一個操作數爲float類型,則將另一個操作數裝換爲double類型。
否則,同時對兩個操作數進行整型提升;然後,如果任何一個操作數爲unsigned long int 類型,則將操作數轉化爲unsigned long int 類型。
否則如果任何一個操作數爲long int 類型,則將另一個操作數裝換爲long int類型。
否則如果任何一個操作數爲unsigned int 類型,則將另一個操作數裝換爲unsigned int 類型。
否則,兩個操作數都轉換爲int類型。
看代碼
int main(void)
{
char ch='a';
int i;
i=ch-32;
return 0;
}
彙編代碼
.text
.global main
main:
pushl %ebp
movl %esp,%ebp
subl $5,%esp
movb $'a',-5(%ebp)
movsbl -5(%ebp),%eax
subl $32,%eax
movl %eax,-4(%ebp)
movl $0,%eax
leave
ret
用到的指令。
指令 | 效果 | 描述 |
---|---|---|
movsbl | 將做了符號擴展的字節傳送到雙字 | 傳送符號擴展的字節 |
ch在參加運算時被提升爲int 類型,並進行運算,並將結果放入i中。ch做了符號擴展。
int main(void)
{
unsigned char ch=100;
int i;
i=ch+255;
return 0;
}
彙編代碼
.text
.global main
main:
pushl %ebp
movl %esp,%ebp
subl $5,%esp
movb $100,-5(%ebp)
movzbl -5(%ebp),%eax
addl $255,%eax
movl %eax,-4(%ebp)
movl $0,%eax
leave
ret
用到的指令。
指令 | 效果 | 描述 |
---|---|---|
movzbl | 將做了零擴展的字節傳送到雙字 | 傳送零擴展的字節 |
ch在參加運算時被提升爲int 類型,並進行運算,並將結果放入i中。ch做了零擴展。
同理short 和unsigned short 也可以做符號擴展和零擴展。
用到的指令
指令 | 效果 | 描述 |
---|---|---|
movswl | 將做了符號擴展的字傳送到雙字 | 傳送符號擴展的字 |
movzwl | 將做了零擴展的字傳送到雙字 | 傳送零擴展的字 |