有任何不懂的问题可以评论区留言,能力范围内都会一一回答
整型提升 (Integral Promotion)是指在计算机编程中,当不同类型的整数类型进行运算时,较小类型的整数会被自动转换为更大类型的整数,以确保运算的正确进行。这种类型转换主要涉及 char 、 short 等小型整数类型和 int 类型。
整型提升的意义在于,CPU的运算器通常设计为以int类型的宽度进行数据操作,因此,为了确保运算的精度和效率,表达式中的char和short类型的操作数必须先转换为int类型,然后才能送入CPU进行处理。
整型提升的规则如下:
对于有符号的char和short类型,提升时在左端补得是最高位(符号位),正数补0,负数补1。
对于unsigned char和unsigned short类型,提升时在左端补0,结果总是正数。
整型提升是编程中的一个重要概念,它帮助确保各种整数类型之间的运算能够正确地进行,同时也提高了程序的兼容性和可移植性。
前言:
char 是一个字节8比特,
作为无符号范围是0到255
作为有符号的范围-128到127
所有编译器int 都默认是signed int
但是char类型不同编译器是不同的,不过vs是signed char
根据以上内容
我们直接来试一道题
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char a = 130;
char b = 120;
printf("%d\n %d\n", b ,a+b);
return 0;
}
这个题目的结果不120和250
因为 char 作为有符号的范围-128到127
vs是signed char(博主用的是vs)
那我们这个时候可以用整形提升来算这道题了
char是八位的,int是32
(这个数据使用时会被转换成int类型)
130 原码补码反码 1111 1111 1111 1111 1111 1111 1000 0010
120 原码补码反码 0000 0000 0000 0000 0000 0000 0111 1000
相加得 1111 1111 1111 1111 1111 1111 1111 1010
截断成char类型1111 1010(但是由于这个变量是char类型因此数据在存储时要被截断)
又因为打印是int类型(这个数据使用时会被转换成int类型)
故为这个是补码 1111 1111 1111 1111 1111 1111 1111 1010
原码为 1000 0000 0000 0000 0000 0000 0000 0110
也就是-6;
因此打印结果就是120和-6
那我们思考下一个问题
以char类型为例(8bit位)
如果内存中存放的是
1000 0000 (补码)
这个值代表多少
如果代表0
那么
0000 0000 (内存中的补码)也代表0
不就矛盾了吗?
答案是
补码1000 0000 代表-128
当然如果把这个补码换做原码还是1000 0000
-128
原码1 1000 0000
反码1 0111 1111
补码1 1000 0000
还是-128
内存中的 补码 所代表的值
0000 0000 | 0 |
0000 0001 | 1 |
0000 0010 | 2 |
0000 0011 | 3 |
...... | ...... |
0111 1111 | 127 |
1000 0000 | -128 |
1000 0001 | -127 |
1000 0010 | -126 |
1000 0011 | -125 |
...... | ...... |
1111 1111 | -1 |
这样你会发现,当1000 0000为负数最大值即-128时,这个表的变化规律是有序的