1、整形提升
1、意义:
C语⾔中整型算术运算总是⾄少以
缺省(默认)整型类型的精度
来进⾏的。
为了获得这个精度,表达式中的
字符
和
短整型
操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。(
注意:整型提升不能对已经是整型类型的数使用
)
2、示例:
int main()
{
char a = 35;
//0000 0000 0000 0000 0000 0000 0010 0011 --(正数,原码和补码相同)
//因为char类型只能存储一个字节(8个bit位)
//0010 0011 --a
char b = 145;
//0000 0000 0000 0000 0000 0000 1001 0001 --(正数,原码和补码相同)
//因为char类型只能存储一个字节(8个bit位)
//1001 0001 --b
char c = a + b;
//计算时以默认类型(整型)来进行运算的,进行整型提升的时候按照符号位进行补足位数(32bit)
//c=a+b
//0000 0000 0000 0000 0000 0000 0010 0011 -- a 最高位为0,故整型提升的时候高位补0)
//1111 1111 1111 1111 1111 1111 1001 0001 -- b (最高位为1,故整型提升的时候高位补1)
//1111 1111 1111 1111 1111 1111 1011 0100 -- c (c=a+b) <补码>
//1000 0000 0000 0000 0000 0000 0100 1100 -- c <原码> ---(补码取反+1且符号位不变)
//由于c是char类型的,最高可以存储8bit
//0100 1100 --c (负值)
printf("%d\n", c);
return 0;
}
验证结果如下:
2、算术转换
如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类
型,否则操作就⽆法进⾏。
![](https://img-blog.csdnimg.cn/direct/cc25310af9e64733a7ef9cf1eb8852f5.png)
3、结论
即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的
计算路径,那这个表达式就是存在潜在⻛险的,建议
不要写出特别复杂的表达式