c语言整型提升规则表,c语言整型提升有什么实际用途

  c语言整型提升规则表,c语言整型提升有什么实际用途

  1.什么是正整数提升?

  官方的解释是:

  整数提升是C编程语言中的一个规则:在表达式计算中,各种整数都要先提升为int类型,如果int类型不足以表示,就提升为无符号int类型;然后执行表达式的运算。

  2.整数提升规则

  整数提升可以分为有符号和无符号两种。

  有符号:提升整数时,根据变量的补码被截断时变量的最高位填充。如果截断后最高位(即最左边的位)的数字为1,则在最高位之前用1填充,如果最高位为0,则在最高位之前用0填充。如果用32位填充,则为int类型。

  无符号:只需在截断的前面加上0。

  直接看代码:

  int main()

  char a=-1;

  有符号char b=-1;

  无符号字符c=-1;

  printf(a=%d\nb=%d\nc=%d\n ,a,b,c);

  返回0;

  }

  上述代码的运行结果如下图所示:(编译器在计算过程中发生了整数提升和截断)

  分析如图所示:

  我们可以分几个步骤来看:

  数字-1的补码是:111111111111111111111111111。当数字-1给A时,由于A、B、C的类型都是char,所以A、B、C中只能存储一个字节,所以只需要截断后八位。“这时就得到补码(因为整数在计算机中是以补码的形式存储的)。

  在%d中打印需要整数提升。一个是a和b有符号数的最高位,然后在前面(最左边)加一得到:1111111111111111。c是无符号数,在前面(最左边)加零得到:00000000000011

  然后转换成原始代码进行打印。a、B原码:100000000000000000000000001(补码相减求逆得到原码)。c原码:000000000000000000000000000000000000000001(整数无符号数原码=补码=补码)。最终结果是a=-1,b=-1,c=255。

  再看另一个例子:

  int main()

  char a=3;

  char b=127

  char c=a b;

  printf(%d\n ,c);

  返回0;

  }

  粗心的老铁看到c=130,跑完之后结果是-126。为什么?

  结合下面的分析:

  我们可以分几个步骤来看:

  数字3的补数是:0000000000000000000000000011。当数字3交给A时,由于A的类型是char,即只有一个字节,即A中只能存储8位,因此只需要截断最后8位,所以A中存储的位为:0000011。

  数字127的补码是:000000000000000000000000000011111。同样,由于char类型的截断,B中存储的位是:0111111。

  在执行a b的时候,8位的A和B要先进行整数升级,因为都是char类型,所以是有符号位。升级时补最高位0,补32位。后两者的补语是:

  00000000000000000000000000000011

  00000000000000000000000001111111

  将a和b相加得到补数:

  00000000000000000000000010000010

  c是char类型,只能存储8位,所以需要截断。截断后,C中存储的位是:1000

  以%d的形式打印需要32位,所以需要对C的整数进行升级,因为C的最高位是1,所以只要在最高位前面加1,就组成了32位。升级后补码为:111111111111111111111111111111111000

  将补码转换成原码并打印出来。转换后的原码为:1000000000000000000000011110为负数,原码对应的整数为-126。

  4.整数提升的意义

  整数提升的意义在于,表达式的整数运算要在CPU相应的运算器中执行,CPU中整数运算器(ALU)的操作数的字节长度一般是int的字节长度,也是CPU通用寄存器的长度。所以,即使两个char类型加在一起,实际上也应该在CPU执行的时候,先在CPU中转换成整数操作数的标准长度。一般CPU很难直接实现两个8位字节的直接相加(虽然机器指令中可能有这样的字节相加指令)。因此,表达式中长度可能小于int长度的各种整数值,在送到CPU执行运算之前,必须先转换成int或无符号int。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: