整形提升

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

整型提升 (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 00000
0000 00011
0000 00102
0000 00113
............
0111 1111127
1000 0000-128
1000 0001-127
1000 0010-126
1000 0011-125
............
1111 1111-1

这样你会发现,当1000 0000为负数最大值即-128时,这个表的变化规律是有序的

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值