.整型提升在c语言中一些表达式在求值的过程中操作数可能需要转换为其他类型这种转换我们程序员是看不见的称其为隐式类型转换而整型提升就是之一1.1什么是整型提升在C语言中计算整数的时候会将整型家族中小于4字节的类型char short自动变为4字节也就是int类型而这个自动转换的过程我们称作整型提升1.2为什么使用整型提升使用原因和硬件有关CPU中负责整数运算的部件整数运算器ALU以及通用寄存器能够一次性处理的数据的大小为4byte也就是32位的二进制数刚好是C语言中一个int的大小这是32位cpu的一次性处理数据的大小64位是8字节为了能保证CPU的高效运算C语言会默认把小于四个字节的整型数据提升到四个字节64位的CPU同样会先提升到int而int在主流编译器中依旧是4字节不知道有没有8字节的无论是32位CPU还是64位CPU只有当操作数本身无法用int存放时才会使用更长字节的整型举个例子 long long a 100; int b 200; long long c a b; //此时我们在计算ab时编译器就会对b进行整型提升以便于和8byte的long long 类型计算 char d 20; b d b; //同理在计算db时会对d进行整型提升提升为四字节的int1.3截断你可能会问如果上面的例子中我c不是long long类型怎么办计算结果是8byte难道我用int型也能装下吗并非如此因为此时会发生截断。1.3.1什么是截断在数据类型中大字节数的数值放到小字节数的变量中时超出变量存储范围的二进制位高位将会被直接丢弃这个行为被称为截断举个例子 char a 10; int b 10; int c 10; a b c; //此时就会发生截断 //00000000 00000000 00000000 00010100 20的32位补码 //当放进1byte的char中时会发生截断变为00010100但结果依旧是20 但是当被截断的数值过大就有可能会导致数值丢失2.整型提升的过程对于有符号数符号位为1时负数在补码的高位补1直至补到想要提升到的字节数bit位数对于有符号数符号位为0时正数在补码的高位补0直至补到想要提升到的字节数bit位数对于无符号数在补码的高位补0直至补到想要提升到的字节数bit位数举个例子 #includestdio.h int main(void) { char a 0; int b 10; int c 10; a b c; printf(%d,a); return 0; } //bc的值为20补码为00000000 00000000 00000000 00010100 //赋值给a时会发生截断所以a存的补码为00010100但值依旧是20 //由于printf函数在打印时打印的是int但a却是char此时会发生整型提升 //20是正整数char默认为signed char所以在高位补0补码为00000000 00000000 00000000 00010100 再举一个例子 #includestdio.h int main(void) { char a 0; int b 100; int c 100; a b c; printf(%d,a); return 0; } //此时计算结果为200补码为00000000 00000000 00000000 11001000 //赋值给a发生截断补码为11001000 //由于a为signed char所以最高位为符号位 //当我们将它以int类型打印时会发生整型提升最高位为1我们补1 //11111111 11111111 11111111 11001000 补码 //原码就等于补码加1再按位取反先求反码和直接求补码的结果是一样的区别就是一个减一取反一个取反加一 //10000000 00000000 00000000 00111000记住符号位不变原码 我们发现此时的结果变为了-56