【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语言中整型提升的知识点,我觉得这对我们对于内存的理解是非常好的,无论是分析还是调试都显的更清晰了。

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

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


    目录
    相关文章
    |
    1月前
    |
    C语言
    【C语言】求整型变量和浮点型变量的绝对值
    【C语言】求整型变量和浮点型变量的绝对值
    23 0
    |
    3月前
    |
    C语言
    c语言点分十进制IP转整型
    c语言点分十进制IP转整型
    |
    7月前
    |
    C语言
    C语言:截断+整型提升+算数转换练习
    截断+整型提升+算数转换练习
    41 0
    |
    7月前
    |
    C语言
    C语言:整型提升
    C语言的整型算术运算至少是以缺省整型类型的精度来进行的。 为了达到这个精度,算术运算表达式中的 字符型char 和 短整型short 需要被转换为普通整型,这种转换成为整型提升。
    53 0
    |
    27天前
    |
    存储 程序员 C语言
    深入理解C语言中的整型数据类型及其应用
    深入理解C语言中的整型数据类型及其应用
    11 0
    |
    29天前
    |
    存储 Shell C语言
    【C/C++ 字符串与整型转换函数】探索C语言中的字符串和整型之间的转换函数
    【C/C++ 字符串与整型转换函数】探索C语言中的字符串和整型之间的转换函数
    15 0
    |
    1月前
    |
    存储 物联网 编译器
    详解【C语言】类型转换--整型提升,算术
    详解【C语言】类型转换--整型提升,算术
    |
    9月前
    |
    C语言
    C语言:使用函数完成整型数组的打印、元素逆置、初始化
    思路: 总体思路: (一). 实现 函数init() -- 初始化数组为全0 (二). 实现 函数print() -- 打印数组的每个元素 (三). 实现 函数reverse() -- 函数完成数组元素的逆置 (四). 完成 主函数 的编写 -- 测试这三个函数
    153 0
    |
    4月前
    |
    缓存 C语言
    C语言中限定输入scanf的为整型(整数),浮点型
    C语言中限定输入scanf的为整型(整数),浮点型
    |
    5月前
    |
    存储 C语言 C++
    C语言 “整型在内存的存储,大小端存储模式的介绍“
    C语言 “整型在内存的存储,大小端存储模式的介绍“
    32 1