一.什么是整形提升CPU内整形运算器的操作数的字节长度一般是 int 类型的长度 。C的整数运算总是以整型类型的进度来进行的。为了获取这个精度表达式中字符和短整型操作数在使用之前被转换为普通整形这种转换称为整形提升。二.怎么进行整形提升规则整形提升是按照变量的数据类型的符号位来提升。负数的整形提升char c1 -1;变量c1的二进制补码中只有8个比特位即1111 1111。怎么得到这个结果的-1 是整数即 4个字节 32个比特位.-1的原码1000 0000 0000 0000 0000 0000 0000 0001-1的反码1111 1111 1111 1111 1111 1111 1111 1110-1的补码1111 1111 1111 1111 1111 1111 1111 1111因为c1只有8个比特位放不下一个整形32个比特位此时就会发生截断只把最后面的8个比特位放进c1里。c1的整形提升c1是有符号char, 整形提升的时候 最高位补充符号位 1 。即 1111 1111 1111 1111 1111 1111 1111 1111正数的整形提升char c2 1;变量c2的二进制补码中只有8个比特位即0000 0001。怎么得到这个结果的1 是整数即 4个字节 32个比特位。因为是正数原码反码补码都是一样的。1 的补码0000 0000 0000 0000 0000 0000 0000 0001因为c2只有8个比特位放不下一个整形32个比特位此时就会发生截断只把最后面的8个比特位放进c1里。c1的整形提升c1是有符号char, 整形提升的时候 最高位补充符号位 0 。即 0000 0000 0000 0000 0000 0000 0000 0001无符号数无符号数整型提升最高位补0。三.整形提升的示例int main() { char a 5; char b 126; char c a b; printf(%d\n, c); return 0; }这个代码运行的结果是什么呢下面来分析5 是正数原反补都一样。5 的补码0000 0000 0000 0000 0000 0000 0000 0101然后截断最后8个比特位a里存放 0000 0101。126 的补码0000 0000 0000 0000 0000 0000 0111 1110截断最后8个比特位b里存放 0111 1110。在这个表达式中 c a b a 和 b 是达不到一个整形的大小整形提升。0000 0000 0000 0000 0000 0000 0000 01010000 0000 0000 0000 0000 0000 0111 1110整型提升后执行运算。结果 0000 0000 0000 0000 0000 0000 1000 0011运算完截断存放1000 0011 。最后打印的是%d (打印整形)这个时候又整形提升这次最高位是 1整型提升的结果1111 1111 1111 1111 1111 1111 1000 0011还没完这次得到的整形提升的结果是补码。-1 得到反码1111 1111 1111 1111 1111 1111 1000 0010取反得到原码1000 0000 0000 0000 0000 0000 0111 1101如果把这个补码放到程序员计算器里就会最终得到这个数字-125这里还有一个例子int main() { char c1 1; short c2 1; printf(%u\n, sizeof(c1)); printf(%u\n, sizeof(c2)); printf(%u\n, sizeof(c1)); printf(%u\n, sizeof(c2)); printf(%u\n, sizeof(-c1)); printf(%u\n, sizeof(-c2)); }这种 c1(c2)和 -c1(c2) 也是表达式计算大小的时候也会发生整形提升。四.什么是算数转换如果某个操作符的各个操作数属于不同类型除非一个操作数转换位另一个操作数的类型否则操作就无法进行。和整形提升不的是整形提升都是 int 的数据类型。而 int 是算术转换的数据类型。寻常算术转换的层次体系long double double float unsigned long int long int unsigned int int例如操作数是float 类型 和 double 类型的时候float 就会转换为double 进行运算如果某个操作数的类型在上面的排行中次位较低要转换为另一个操作数的类型后进行运算。但是算术转换要合理不然会有丢失进度的风险。例如float f 3.14; int num f; //会有进度的丢失看到这里不知道你对整形提升和算数转换是否增加一些看法呢最后也是,byebye