表达式求值顺序一般是按照操作符的优先级顺序来决定,但是,有些表达式求值的过程中还涉及到类型的转换与统一
目录
隐式类型转换
C语言在求值计算时总是存在 short,char类型与 int 类型的表达式计算,而此时我们就应该进行整型提升将 int 以下的类型提升成一个整型再进行计算。
那整型提升该怎么升呢?
整型提升
整型提升是对该数的二进制补码按照变量的数据类型的符号位来提升的
补充:一个整数如何整型提升与数据类型也有关系,以上只是针对于有符号整型,那么对于无符号整型的提升,我们采取高位直接补0的方式。
实例:
这里为什么计算结果是这个玩意儿呢?难道不是128嘛。请继续看下去:
那么来看看这道小题:猜猜打印结果
??只会打印c,因为前两个会发生整形提升。前面补符号位1
0xb6十六进制转换成二进制以后是1011 0110,符号位是1,所以进行整形提升就在前面补1,然后求原码进行判断比较。
什么时候会发生整型提升
- 当
char
、short
等小于int
类型的数据,在参与算术运算(比如加法、减法、乘法、除法等)或者按位运算(像&
、|
、^
等)或关系运算(如==
、!=
、<
、>
、<=
、>=
)或逻辑运算(像逻辑与(&&
)和逻辑或(||
)运算),会自动提升为int
类型。 - 如果函数参数要求是
int
类型等,而传入的是char
、short
等小于int
类型的数据,会发生整型提升,将其转换为int
类型再传递给函数。例如有函数void func(int num)
,调用func('a')
时,字符'a'
对应的char
类型值会先进行整型提升转换为int
类型传入函数中。
算数转换
算数转换的对象是 int 之上的类型之间的转换。就是说,以下的任意两种类型发生计算的时候,会发生类型统一,都统一成较高的类型(就是图中的向上转换)
小题一道:
#include <stdio.h>
int i=0; //全局变量未给初始值时,自动默认为0
int main()
{
i--;
if (i > sizeof(i))
{
printf(">");
}
else
{
printf("<");
}
return 0;
}
该题十分隐蔽,博主也掉入陷进,现在分享给你们:
变量 i 是 int 类型的数,而 sizeof(i) 准确来说是unsigned int类型,通过上面的图表你会发现,unsigned int 在int 上面,所以说编译器执行到该行时偷偷的发生了算数转换,统一转换成了unsigned int类型所以式子左边的-1转换成unsigned int 就变成了一个极大地的字,远远的大于 sizeof(i)的值。其实就是2^31+1