C语言整型提升

目录

什么是整型提升

C语言中整型算数运算总是以整型类型的精度来进行的。表达式中的字符和短整型操作数在使用之前被 转化为普通整型,这种转换称为整型提升

为什么会存在整型提升?

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度⼀般就是int的字节长度,同时也是CPU的通用寄存器的长度。

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

如何进行整型提升

有符号整数 提升是按照变量的数据类型的符号位来提升的

当我们对变量进行赋值的时候,

例如char num = -129,高位是1,然后低位是129,对应二进制就是1 1000 0001,因为有符号且为负数,所以取补码就是1 0111 1111然后截取后八位存入。所以内存中存入的是0111 1111,然后输出的时候,会进行整型提升,因为高位时0,所以认为是正数,前面全部补0,最会就会输出127。
正数:

例如:

当我们对变量进行赋值的时候,

例如char num = 129。二进制是1000 0001,因为是正数,所以会直接存入。但是当输出的时候,会因为高位是1,且是char类型,会进行整型提升,前面补1,最后就是11111111 11111111 11111111 1000 0001然后将此数认为是补码,所以要取原码就是10000000 00000000 00000000 0111 1111结果就是对应的十进制-127。

无符号数整型提升,高位补0

c 复制代码
int main()
{
	char a = 5;
	char b = 126;
	char c = a + b;
	printf("%d\n", a + b);
	printf("%d\n", c);
	unsigned char m = 245;
	unsigned char n = 12;
	unsigned char p = m + n;
	printf("%d\n", m + n);
	printf("%d", p);
	char q = 0xF0;
	printf("%d\n", q);
	return 0;
}

如上代码输出:

第一个printf输出a + b的值,就是131。%d是按照10进制打印有符号数。

第二个printf输出c的值

a,b在参与运算之前进行整型提升为

a:000000000000000000000000 0000 0101

b:000000000000000000000000 0111 1110

高位补符号位

截取后面8位存储在a和b中

二者相加为1000 0011

然后进行整型提升,整型提升高位为符号位

111111111111111111111111 1000 0011

因为计算机以补码存储,所以相加也是补码相加,且相加后高位为1,所以认为得到的就是c的补码。

然后找其原码

100000000000000000000000 0111 1101

最后就输出-125
整型提升和CPU运算器有关系,在其他架构的CPU上整型提升可能不一样,跑出来的结果也可能不一样。

第三个printf输出输出m + n的值,就是131。

第四个printf输出p的值

m:000000000000000000000000 1111 0101

n:000000000000000000000000 0000 1100

m + n:

000000000000000000000001 0000 0001

因为是无符号数,所以不变,直接截断,输出1

第五个printf

在我们输入整型常量的时候,默认无符号值,直接就把给的0xF0输入,但是我们的变量是char类型,有符号,就默认高位是符号位,输出的时候会对原来的值取反然后加1,就是0xF0的补码。就是-16

相关推荐
SomeB1oody24 分钟前
【RustyML入门】5.0. 模型评估
开发语言·后端·机器学习·rust·教程
Evand J36 分钟前
【MATLAB例程,PDR11】二维平面下的PDR(行人航位推算)步态检测与EKF融合定位,附代码的下载链接
开发语言·matlab·平面·pdr·行人导航·步态检测
牛油果子哥q1 小时前
C++STL算法超全精讲:排序/查找/去重/遍历/最值/合并全套API、仿函数、Lambda适配、实战避坑
开发语言·c++·算法
Xeon_CC1 小时前
用C++编写屏幕准星
开发语言·c++
是隼人1 小时前
buuctf-pwn bjdctf_2020_babystack2题解 整数溢出(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
孤存5221 小时前
c语言动态内存管理
c语言·开发语言·算法
祖力551 小时前
快速学会数据结构中的链式队列与循环队列
linux·c语言·数据结构·算法
冰暮流星1 小时前
javascript之webstorage用法
开发语言·javascript·ecmascript
我一定会有钱2 小时前
打造完美工作流:Git 配置”一次推送,三端同步”(Gitee/GitCode/GitHub)
开发语言·windows·vscode·搜索引擎·gitlab·github·visual studio code
matlab代码2 小时前
基于matlab肤色人脸标记检测系统 GUI界面【源码53期】
开发语言·matlab·人脸标记