关于整型提升(C语言)

Posted -YIN

tags:

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

C语言整型提升(隐式类型转换)


  

定义

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

这一规则是由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.”

翻译:“ 表达式中可以使用整数的地方,就可以使用枚举类型,或有符号或无符号的字符、短整数、整数位域。 如果一个 int 可以表示原始类型的所有值,则将该值转换为 int; 否则该值将转换为无符号整数。 这个过程叫做整型提升。”

  

整型提升的意义

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

//例1:
    char a,b,c;
    a = b + c;	

b, c的值被提升为普通整型进行加法运算。但是运算结果会被截断再存储到a中。

//例2: 关于结果截断更明显的示例
    unsigned char a = 0;
	unsigned char b = 255;
	unsigned char c = 255;
	a = b + c;         //无符号
	printf("%u\\n", a);

截断

  

整型提升

整型提升是按照变量的数据类型 (变量本身的数据类型) 的符号位进行提升。

//正数整型提升
char a = 1;
a在内存中为(二进制补码):0000 0001
因为 char 有符号符号位为0,所以整型提升由8个bit到32个bit:
0000 0000 0000 0000 0000 0000 0000 0001
  
//负数整型提升
char a = -1;
a在内存中为(二进制补码):111 1111
因为 char 有符号符号位为1,所以整型提升由8个bit到32个bit:
1111 1111 1111 1111 1111 1111 1111 1111

例题:
int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if (a == 0xb6)
		printf("a\\n");
	if (b == 0xb600)
		printf("b\\n");
	if (c == 0xb6000000)
		printf("c\\n");
	return 0;            //输出结果为 c
}

0xb6的二进制补码为 1011 0110因为char是有符号,等于运算整型提升补1,结果不等于0xb6,为假。

  

//特例:
int main()
{
    char c = 1;
    printf("%u\\n", sizeof(c));
    printf("%u\\n", sizeof(+c));
    printf("%u\\n", sizeof(!c));
    return 0;
}

c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节;但(!c)是否整型提升跟编译器有关,有待研究。

V S 2013运行截图
Dev C++运行截图

以上是关于关于整型提升(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

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

C语言中的整型提升

C语言中的整型提升

C语言整型提升

C语言二操作符详解(隐式类型转换之整型提升,算术转换)

C语言基础——整型提升