1 求值的顺序一部分是由操作符的优先级和结合顺序决定的 而另一部分,也可能要进行其他类型的转换
1 隐式类型转换
整型提升
定义:c语言的整型算数运算,总是至少以缺省整型类型的精度来进行的,为了!获得这个精度,表达式中的字符和短整型操作数 在使用之前被转化为普通的整型,这就叫整型提升(就是把字符和短整型操作数来进行普通类型的转化)
意义:表达式的整型运算在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度,一般是int的字节长度,因此即使是两个char类型的相加,在CPU上运行时也是转化为操作数的标准字节的长度 所以表达式中,所有小于int长度的整型值(如char 类型short类型),必须先转化为int 或unsigned int 的类型 之后才能送到CPU中去进行运算
char a,b,c;
...............
算 a = b + c; 运算时就是要把b和c的类型换成整数型,之后再去付给a a没有整型提升,所以a是1个字节 ,b c 进行了整型提升,是4个字节,多出来了3个,就去把多的3个!截断
整型提升是按照变量的数据类型的符号位来提升的
一个字节转换为四个字节的时候 一个字节前补的位是数据类型的符号位来补充的,符号位是什么 就补充什么
没有符号位的 高位都补0
#include<stdio.h>
int main()
{
char a = 3;
// 00000000 00000000 00000000 00000011 这个是整数类型的 4个字节
// 00000011 这个是字符类型的 1个字节
char b = 127;
// 00000000 00000000 00000000 01111111
// 01111111
char c = a + b;
// 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 01111111
// 00000000 00000000 00000000 10000110 最后的c是char的类型 所以要的是八个比特位
printf("%d",c);//10000110 -126
return 0;
}
补码进行运算 计算机内都是以补码的形式存储的
如果对C进行整型提升
11111111 11111111 11111111 10000110 补码
11111111 11111111 11111111 10000001 反码
1000000 0000000 0000000 011111110 原码
2 算数转换
如果一个操作符的各个操作数,属于不同的转换类型,除非操作数是同一种类型 ,要不然是不进行运算的 向字节长的去转换
操作符的属性
1 操作符的优先级(优先级是另一篇博客上的)
2 操作符的结合性
3 是否控制求值顺序