隐式类型转换
c的整形算术运算总是至少以缺省整型类型的精度来计算的
为了获得这个精度,变浓的是的字符和短整型的操作数在被使用前被转换为普通型,这中类型转化被称为整型提升
整形提升的意义:
表达式的整形运算实在cpu的相应的运算器内执行,cpu内整形运算的操作数的字节长度一般就是int长度的字节,同时也是cpu内整形操作数的标准长度
因此。即使两个字符类型相加,在cpu执行时实际也是先转化为cpu内整型操作数的标准长度。
通用cpu是难以直接实现两个8比特字节的直接相加运算。所以表达式各种长度小于int长度的整型值,都必须先转化为int或unsigned int才能进入cpu内运算。
如:char a, b, c;
.....
a = b+c;
这里的b和c先会被提升到普通整行时再参与计算。加运算结束后。结果将会被截断,然后再执行加法运算。
如何进行整型提升呢?
整型提升按照变量的数据类型的符号位来提升的。 高位补充符号位 无符号整型提升高位补零。
int main() { char a = 3; //00000000000000000000000000000011 //00000011--截断 char b = 1237; //00000000000000000000000001111111 //01111111--截断 char c = a + b; //00000000000000000000000100000010 //10000010--c 只取八位 //整型提升 printf("%d", c); //11111111111111111111111110000010 //11111111111111111111111110000001 //10000000000000000000000001111110 //-126 return 0; }
一般会发生的整型提升的例子:
int main() { //char 的范围-128~127 //unsigned char char a = 0xb6; short b = 0xb600; int c = 0xb6000000; if (a == 0xb6) printf("a"); if (b == 0xb600) printf("b"); if (c == 0xb6000000) printf("c"); //只有c打印,a与b都需要整形提升,提升之后值改变 return 0; }
整型提升,值发生了变化。
int main() { char c = 1; char d = 2; printf("%u\n", sizeof(c));//1 printf("%u\n", sizeof(+c));//4 printf("%u\n", sizeof(-c));//4 printf("%u\n", sizeof(c+d));//4 //整形提升 return 0; }
我们可以根据数据类型来判断整型提升是存在的。
算术转换
如果某个操作数属于不同的类型,那麽除非其中一个操作数转为另一个操作数的类型,否则操作无法进行。寻常算术转换的层次体系:
long double
double
float;
unsigned long int
long int
unsigned int
int
如果一个数的类型在上面的列表很低,则它需要转化到另一个操作数的类型。
但是算数转化要合理。
float f = 3.14; int num = f;//精度丢失
操作符的属性
复杂表达式求值有三个影响因素:
1.操作符的优先级
2.操作符的结核性
3.是否控制求值顺序
表达式的求值部分由操作符的优先级决定
操作符的优先级只能决定自减--的运算在+的运算的前面,但是我们没有办法的值,+操作符的左操作数的获取在右操作符之前还使之后求值,所以结果是不可预测的。
int fun() { static int count = 1; return ++count; } int main() { int answer; answer = fun() - fun() * fun(); printf("%d\n", answer);//输出多少? return 0; }
比如在这个函数调用,你如何去判断到底哪一个先去调用,这是不可预测的,值就不得而知。