栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C语言]【整形提升】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C语言]【整形提升】

整形提升
  • **整形提升**
  • **为什么需要整形提升**
  • **整形提升的条件**
  • **整形提升的规则**
  • **引例**

整形提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

为什么需要整形提升

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsignedint,然后才能送入CPU去执行运算。

整形提升的条件

什么时候可能会发生整形提升呢?

  • 表达式运算
    当在进行表达式的计算时,表达式中内存大小小于int(short, char)的都会被提升为整形来进行计算
  • 使用操作符时
    当整形操作数的长度小于int的长度时就会发生整形提升
  • 使用printf打印时
    当在使用printf打印时选择的打印类型为%d,%u时就会发生整形提升
整形提升的规则

对于有符号整形

  • 看符号位,若为1(负数)则高位全部补1. 若为0(正数)则高位全补0.

对于无符号整形(unsigned)

  • 不管正负数,高位全部补0.
引例
void  main()
{
	char a = 3;
	//00000000000000000000000000000011
	//00000011 - a
	char b = 127;
	//00000000000000000000000001111111
	//01111111 - b

	char c = a + b;
	//发现a和b都是char类型的,都没有达到一个int的大小
    //这里就会发生整形提升
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010
	
	//10000010 - c
	//11111111111111111111111110000010 - 补码
	//11111111111111111111111110000001 - 反码
	//10000000000000000000000001111110 - 原码
	//-126
	//内存储存的是补码,打印的是原码
	printf("%dn", c); //-126,如果没有发生整形提升,最后结果应该为130

}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869667.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号