整型提升(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去执行运算。

posted @   1379号监听员"  阅读(234)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示