從C語言到彙編(二)類型裝換

在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 將做了零擴展的字傳送到雙字 傳送零擴展的字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章