C的整形算数总是至少以缺省整形类型的精度来进行的
为了获得这个精度 表达式中的字符和短整形操作数在使用之前被转换为普通整形 这种类型转换成为整型提升
给出代码实例↓
#include<stdio.h>
int main()
{//char = signed charchar a = 3;char b = 127;char c = a + b;printf("%d", c);return 0;
}
正常来说结果为130 但是运行结果为什么是↓
为什么呢 这就牵扯到了整形提升(针对二进制的序列补码)
所谓的整形提升分为 有符号的 和 无符号的整形
对于有符号的最高位是0就补0 , 1就补1
无符号的全都补0
先从a看起3的普通整形是(4个字节)
a:00000000000000000000000000000011
但是a的类型是char (一个字节)此时就会发生截断保留后面八个比特位
a:00000011
b也是同样的原理 截断后
b:01111111
运算时 a,b会被提升为普通整形(32比特位)再进行运算
就会有
a:00000000000000000000000000000011
b:000000000000000000000000011111111
c:00000000000000000000000010000010
c是char类型 又会发生截断
c:10000010
%d是打印十进制的整数 c发生整形提升
11111111111111111111111110000010 补码
10000000000000000000000001111110 原码
二进制转换为十进制的结果位-126
#include<stdio.h>
int main()
{//char = signed charchar a = 3;//00000000000000000000000000000011//截断//00000011char b = 127;//00000000000000000000000001111111//01111111char c = a + b;//00000011//01111111//整形提升//00000000000000000000000000000011//00000000000000000000000001111111//00000000000000000000000010000010//10000010printf("%d", c);//c整形提升//11111111111111111111111110000010补码//10000000000000000000000001111110原码//-126return 0;
}