从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 将做了零扩展的字传送到双字 传送零扩展的字
发布了185 篇原创文章 · 获赞 18 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/pk_20140716/article/details/103095827