在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 | 将做了零扩展的字传送到双字 | 传送零扩展的字 |