C语言 整型提升

一、介绍

C语言中整型算术运算总是至少以缺省整型(int)类型的精度来进行的。

为了获得这个精度,表达式中的字符(char)和短整(short)型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

二、演示

例如:

char a = 5;
char b = 127;
char c = a+b;

printf("%d",c);

//在此处我们就需要用到整型提升

// 首先,分别将 char a 和 char b 的补码展示出来
//由于 a和b 都是char类型,我们可以先展示二者的int 类型,然后进行截断,得到 二者char类型的补码

// char a = 5 
// 0000 0000 0000 0000 0000 0000 0000 0101 - int a 的补码
// 0000 0101 - char a 的补码 - 进行了截断

// 因为char是1字节的,所以只有八个bite也就是八位二进制数位,所以从右到左取下八位二进制数位

// char b = 127
// 0000 0000 0000 0000 0000 0000 0111 1111 - int b 的补码
// 0111 1111 - char b 的补码 - 进行了截断 

// 整型提升的目的是放置char类型和short类型在进行运算的过程中会发生栈溢出,而导致的数据错误

// 因此,在char类型和short类型的运算中,要将二者进行补位,提升到int类型

// 补位其实就是将二者的二进制数位的补码中的最高位进行补位,若最高位是1则补1,最高位是0则补0

// char a - 0000 0101 最高位是0补0
// 0000 0000 0000 0000 0000 0000 0000 0101 - 整型提升

// char b - 0111 1111 最高位是0补0
// 0000 0000 0000 0000 0000 0000 0111 1111 - 整型提升

// char c = a + b;
// 0000 0000 0000 0000 0000 0000 0000 0101 - a
// 0000 0000 0000 0000 0000 0000 0111 1111 - b
// 0000 0000 0000 0000 0000 0100 1000 0100 - c

// 由于c是char类型,所以再次截断
// 1000 0100 - 截断后

// printf("%d",c); 因为是%d 类型打印 所以需要再次进行整型提升,并且在整型提升后转为原码

//整型提升:
// 1111 1111 1111 1111 1111 1000 0100 - 由于c的最高位是1所以补1 

// 1000 0000 0000 0000 0000 00111 1100 - 进行了补码转原码 

// 所以最后的答案是 -124 

猜你喜欢

转载自blog.csdn.net/2301_76445610/article/details/132167923