整型提升(C语言)
在学习前我们需要知道一些基本的知识:
1.二进制表示有:原码 反码 补码;
存储到内存为补码;
打印到屏幕上为原码;
2.signed char(有符号字符型)-128~127
unsigned char(无符号字符型)0~255
整型提升:
C的整型算术运算总是至少以缺省整型类型的精度来进行的
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
如何进行整型提升呢?
整型提升是按照变量的数据类型的符号位来提升的
有符号,高位补充符号位
无符号,高位补充 0
下面我们来看一串代码:
#include<stdio.h> int main() { char a = 3; //00000000000000000000000000000011 //因为char占一个字节,8个bit,从最低位开始取8个 //00000011 - a char b = 127; //00000000000000000000000001111111 //01111111 - b char c = a + b; //a与b相加 //00000000000000000000000000000011 a (高位补0) //00000000000000000000000001111111 b (高位补0) //00000000000000000000000010000010 a+b //10000010 - c //11111111111111111111111110000010 - 补码(高位补1) //11111111111111111111111110000001 - 反码 //10000000000000000000000001111110 - 原码 //-126 printf("%d\n",c); return 0; }
由以上代码可以得出结果为:-126
下面我们再来看一个例题:
#include<stdio.h> int main() { char a = 0xb6; short b = 0xb600; int c = 0xb6000000; if(a == 0xb6) printf("a\ny"); if(b == 0xb600) printf("b\n"); if(c == 0xb6000000) printf("c\n"); return 0; }
其中a为char类型,经过整型提升后为负数,即整型提升后a不在等于0xb6
同理b为short类型,经过整型提升后也为负数,b也不再为0xb600
而c本就是int类型,无需改变,即c==0xb6000000成立
输出结果为:c
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通