【C语言】整形提升和整形截断

整形提升:

K&R(C语言第一本编程书的编著者)在C中将整形提升定义为:
“A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion.”
大致意思分为两点:

  • 1.只要一个表达式中用到了整形,那么类型为char, short int或整形位域的变量,以及枚举的类型都可以被放在这个整形变量的位置。
  • 2.如果条件一中的原始类型值域可以被int表示,那么原值转换为int,否则的话,转换unsigned。

以上两点的结合,被称为整形提升

举例说明:

  • 1.关于条件1的举证:
#include

using namespace std;

int main()
{
	unsigned char a = 100;
	unsigned char b = 200;
	unsigned char c = 0;
	c = a + b;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	printf("a + b = %d\n", a + b);

	system("pause");
	return 0;
}

答案:
【C语言】整形提升和整形截断_第1张图片
是不是很奇怪,为什么c的值会和预期的不一样呢?让我来解释一下:

a的二进制为:11001000
b的二进制为:01100100
a+b的二进制为:1 00101100(前面的1因为超过了8位二进制位所以要舍弃)
以%d的形式输出,就需要用到整形提升。(也就是我们上文所说的,要将char类型的表达式转换为int类型的表达式,进行补0操作)
c的二进制变为:00000000 00000000 00000000 00101100(44)
a整型提升为:00000000 00000000 00000000 11001000
b整型提升为:00000000 00000000 00000000 01100100
a+b:00000000 00000000 00000001 00101100 (300)

因此,最后 c = 44 。
ps:有符号char.short类型如果为负数,则要进行补1操作。而无符号同一进行补0操作

  • 2.关于条件2的举例
#include
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");  
   system("pause");
   return 0;
 }

答案:c
因为上式中,char和short在比较时,被默认为unsigned char和unsigned short,导致在整形提升时,会转换成unsigned int类型,导致a,b出错。而c不需要整形提升,所以c是争取的。

整形截断:

#include
#include
int main()
{
	char i = 129;
	printf("%d\n", i);
	system("pause");
	return 0;
}

结果:【C语言】整形提升和整形截断_第2张图片
因为给i赋值的129是一个十进制,而i的类型为char,其只能截取低8位bit位。
129的二进制:00000000 00000000 00000000 10000001
i截取后的二进制:10000001

因为最后需要以十进制的方式打印,所以要在i前面补1
i的二进制位:11111111 11111111 11111111 10000001
以补码的形式存储:
i的补码为:10000000 00000000 00000000 01111110 -127

你可能感兴趣的:(C)