【C语言】整型提升

简介: 【C语言】整型提升

前言

🎈大家好,我是何小侠🎈

🌀大家可以叫我**小何或者小侠🌀**

🔴我是一名普通的博客写作者🔴

💐希望能通过写博客加深自己对于学习内容的理解💐

🌸也能帮助更多人理解和学习🌸

🍃我的主页:何小侠的主页🍃



    这篇博客我们一起来学习C语言中的整型提升,这对我们理解内存很有好处。

    整型提升🍊

    在C语言中经常会遇到类型转换,比如说

    这张图中并没有包含,short 和 char 类型,是因为它们都会在需要隐式类型转换转换为 int

    那为什么需要整型提升呢?

    也就是整型提升到底好在哪里?

    在CPU中会有相应的运算器执行整型的运算过程,而这个运算器(ALU)的操作数的字节长度一般就是int 的字节长度,同时也是CPU通用寄存器的长度。

    因此小于int字节数的两个类型,char short 需要在先转换为int再执行运算。

    通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。

    所以,表达式中各种长度可能小于int长度的整型值,

    都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

    例子🍊

    //例1
    char a,b,c;
    ...
    a = b + c;

    如果两个char 类型相加就会先整型提升,再相加,再加法完之后还会发生截断再存储在a中,因为a中只能存储8个比特位。当然对算术运算都是符合的。

    再看

    到底如何整型提升🍊

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

    无符号整形提升,高位补0,有符号整型提升,高位补充符号位

    这就是我们整型提升最重要的一点

    来看看一个例子

    int main()
    {
      char a = -1;
      int b = 1;
      int c = a + b;
      printf("%d", c);
      return 0;
    }

    这里就发生了int = char + int ,这个时候就需要发生整型提升。

    但是我们要先补充一个知识

    int main()
    {
      char a = -1;
      int b = 1;
      int c = a + b;
      printf("%d", c);
      return 0;
    }

    下面就是详细的讲解

    一定要记住什么时候要截断,什么时候要提升,提升要按照符号位提升。

    我们再来看看一个例子

    int main()
    {
      char c1 = 3;
      char c2 = 127;
      char c3 = c1 + c2;
      printf("%d\n", c3);
      return 0;
    }

    这里是char = char + char。

    最后还需要按照%d形式打印

    再来一个例子

    int main()
    {
      char a = 0xb6;
      short b = 0xb600;
      int c = 0xb6000000;
      if (a == 0xb6)
        printf("a");
      if (b == 0xb600)
        printf("b");
      if (c == 0xb6000000)
        printf("c");
      return 0;
    }

    我们还是慢慢来,逐渐习惯分析,当分析与结果一致是很快乐的。

    最后一个例子:

    int main()
    {
     char c = 1;
     printf("%u\n", sizeof(c));
     printf("%u\n", sizeof(+c));
     printf("%u\n", sizeof(-c));
     return 0;
    }

    与之前的几个例子一样思路即:

    第一个printf不会发生整型提升,但是在后两个中,由于±符号的添加,需要表达式运算范畴,

    所以sizeof(+c) 就是4个字节 ,sizeof(-c)也是4个字节。

    总结🍊

    这篇博客我们系统的介绍了C语言中整型提升的知识点,我觉得这对我们对于内存的理解是非常好的,无论是分析还是调试都显的更清晰了。

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

    如果本文有任何错误或者有疑点欢迎在评论区评论


    目录
    相关文章
    |
    7月前
    |
    C语言
    【C语言】求整型变量和浮点型变量的绝对值
    【C语言】求整型变量和浮点型变量的绝对值
    144 0
    |
    7月前
    |
    C语言
    c语言点分十进制IP转整型
    c语言点分十进制IP转整型
    |
    2月前
    |
    存储 C语言
    C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
    在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
    |
    7月前
    |
    C语言
    c语言表达式求值--整型提升
    c语言表达式求值--整型提升
    |
    3月前
    |
    存储 C语言
    【C语言基础考研向】04整型进制转换
    本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
    |
    6月前
    |
    存储 编译器 C语言
    C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
    C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
    65 2
    |
    6月前
    |
    存储 C语言
    C语言整型详解
    C语言整型详解
    |
    6月前
    |
    存储 编译器 C语言
    【C语言】:整型提升,算术转换与大小端的介绍
    【C语言】:整型提升,算术转换与大小端的介绍
    48 0
    |
    6月前
    |
    C语言
    C语言---单身狗(1)---在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字
    C语言---单身狗(1)---在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字
    |
    6月前
    |
    存储 编译器 C语言
    C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)二
    C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)二
    39 0