表达式求值顺序一般是按照操作符的优先级顺序来决定,但是,有些表达式求值的过程中还涉及到类型的转换与统一
目录
隐式类型转换
C语言在求值计算时总是存在 short,char类型与 int 类型的表达式计算,而此时我们就应该进行整型提升将 int 以下的类型提升成一个整型再进行计算。
那整型提升该怎么升呢?
整型提升
整型提升是对该数的二进制补码按照变量的数据类型的符号位来提升的
补充:一个整数如何整型提升与数据类型也有关系,以上只是针对于有符号整型,那么对于无符号整型的提升,我们采取高位直接补0的方式。
实例:
这里为什么计算结果是这个玩意儿呢?难道不是128嘛。请继续看下去:
那么来看看这道小题:猜猜打印结果
什么时候会发生整型提升
相信通过上面内容的学习你对整型提升有了一定的了解,为了让你印象深刻,请看:
这样是不是好多了呢,直接用就行了。
算数转换
算数转换的对象是 int 之上的类型之间的转换。就是说,以下的任意两种类型发生计算的时候,会发生类型统一,都统一成较高的类型(就是图中的向上转换)
小题一道:
#include <stdio.h>
int i; //全局变量未给初始值时,自动默认为0
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
该题十分隐蔽,博主也掉入陷进,现在分享给你们:
变量 i 是 int 类型的数,而 sizeof(i) 准确来说是unsigned int类型,通过上面的图表你会发现,unsigned int 在int 上面,所以说编译器执行到该行时偷偷的发生了算数转换,统一转换成了unsigned int类型所以式子左边的-1转换成unsigned int 就变成了一个极大地的字,远远的大于 sizeof(i)的值。