表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定
同样,有些表达式的操作在求值的过程中可能需要转换为其他类型
隐式类型转换–也就是偷偷转换(我们看不见得转化)
C的整形算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前转换成普通整形,这种转换称为整形提升
整形提升的意义:(为什么存在有整型提升?)
表达式的整形运算要在CPU的相应运算器件内执行,CPU内整形运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU通用的寄存器的长度。
因此,即是两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整形操作数的标准长度。
#include<stdio.h>
int main()
{
char a = 127;
char b = 3;
char c = a + b;
//00000000000000000000000001111111 --a的32位形式下的存储
//00000000000000000000000001000011 --b的32位形式下的存储
//但是a和b都是char类型的,char之由一个字节,所以a,b为:
//01111111 --a
//00000011 --b
//字符在算的时候都达不到整形的大小,所以要先把他们提升成整形的大小,然后再进行运算
//a,b均为有符号的char类型,所以最高位是符号位
//所以需要把a首先补成这个样子,00000000000000000000000001111111
//b是同理,b变成了,00000000000000000000000001000011
//将a和b进行相加:
//00000000000000000000000001111111
//00000000000000000000000001000011
//00000000000000000000000010000010 ---a和b相加的结果
//a+b的结果要存在c里面,只能存在有8个比特位,结果为10000010
//对c进行整形提升,要补的是符号位,补完的结果如下所示:
//11111111111111111111111110000010 ---再内存中放的是补码,打印的是原码
//补码-1是反码
//反码为:11111111111111111111111110000001
//原码为:10000000000000000000000001111110 --结果为-126
printf("%d", c); //---126
return 0;
}
//无符号数进行提升的时候,只能补0
char所能表示的范围:-128~+127
(RAND_MAX的值为32767,为short类型所能表示的最大值)
char
127+3,显而易见就是-126
#include<stdio.h>
int main()
{
char a = 0xb6;//11000110
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
system("pause");
return 0;
}
//打印的结果为c
//另外两个都发生整形提升了
#include<stdio.h>
int main()
{
char c = 1;
printf("%u\n", sizeof(c));//1
printf("%u\n", sizeof(+c));//4
printf("%u\n", sizeof(!c));//4
return 0;
}
//+c和!c都需要进行运算,进行运算就会发生整形提升,那么就变成int类型了
//sizeof(int) ,结果就是4无疑了。