详细刨析整形提升
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.
以上是关于详细刨析整形提升的主要内容,如果未能解决你的问题,请参考以下文章