详细刨析整形提升

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详细刨析整形提升相关的知识,希望对你有一定的参考价值。

一.整形提升

1.概念

整形提升是隐式转换的一种特殊情况。
首先说明计算机进行逻辑和算术运算是在CPU相应运算器件内执行的。而数据是保存在内存里的,CPU进行运算时要将数据从内存保存到CPU的寄存器里。而CPU通用寄存的长度是与int(整形)字节长度相同,也就是4字节长度。
所以当表达式中各种长度小于int长度的整形值做逻辑或者算术运算时,都必须先转为int或者unsigned int,然后再进行运算。
例如:

char a,b,c;
a=b+c;

此时b和c的值从signed char 被提升成了signed int,然后再进行加法运算。加法运算完成后,结果被截断,再存储到a中。

2.怎么做

整形提升是根据需要整形提升的数的类型决定的。当该数为无符号数时,在进行提升时,高位填充0,当该数为有符号数时,在进行提升时,高位补充该数的符号位。
例如:

#include<stdio.h>
int main()
{
	unsigned char c1 = 1;//0000 0001
	char c2 = -1; //1111 1111
	//输出为 %d 有符号整形  %u 无符号整形,要进行整形提升
	printf("%d\\n", c1);//0000 0000 0000 0000 0000 0000 0000 0001
	printf("%u\\n", c1);//0000 0000 0000 0000 0000 0000 0000 0001
	printf("%d\\n", c2);//1111 1111 1111 1111 1111 1111 1111 1111
	printf("%u\\n", c2);//1111 1111 1111 1111 1111 1111 1111 1111
	return 0;
}

输出为:
在这里插入图片描述
这个例子帮助理解,这里unsigned char c1输出看不出来什么,但是通过char c2(默认signed),当输出为%u时数值为4294967295,可以证明高位补充了符号为1。
ps:个人理解:c2 %d 和%u为什么为-1和4294967295?
通过整形提升后c2二进制数为代码注释所示,而输出为无符号整形补码等于原码,计算后得出4294967295。而%d为什么输出为-1,需要将整形提升的补码转化为原码,符号位不变,减1再取反。二进制为//1000 0000 0000 0000 0000 0000 0000 0001//所以为-1

二.例子

#include<stdio.h>

int main()
{
	char a = 0xb6;//1011 0110
	short b = 0xb600;//1011 0110 0000 0000
	int c = 0xb6000000;//1011 0110 0000 0000 0000 0000 0000 0000
	if (a == 0xb6)//1111 1111 1111 1111 1111 1111 1011 0110
		printf("a\\n");
	if (b == 0xb600)//1111 1111 1111 1111  1011 0110 0000 0000
		printf("b\\n");
	if (c == 0xb6000000)//1011 0110 0000 0000 0000 0000 0000 0000
		printf("c\\n");
	printf("a=%x\\n", a);
	printf("a=%x\\n", b);
	printf("a=%x\\n", c);
	return 0;
}

这里输出:
在这里插入图片描述
注意:计算机直接定义char short int…等类型默认为有符号的。当进行判断是否相等时进行逻辑运算,要进行整形提升。提升成如代码注释所示,这里注意a,b的符号位看最高位为1,所以补充1.

以上是关于详细刨析整形提升的主要内容,如果未能解决你的问题,请参考以下文章

详细刨析C语言数据的储存

C语言学习--代码分析整形提升过程

微信小程序测试点详细刨析

30s源码刨析系列之函数篇

详细刨析Linux权限。包含权限的概念权限的修改粘滞位等等。

详细刨析Linux权限。包含权限的概念权限的修改粘滞位等等。