该“整数提升”是指将隐藏得太深了...
C整数提升简介整数提升是C编程语言中的一项规定:对表达式进行求值时,必须首先将各种整数提升为int类型,如果int类型不足以表示,则需要将其提升为int类型。 unsigned int type,然后执行表达式的操作。
该规则是由C语言的发明者Dennis Rich和Ken Thompson创建的:“可以使用一个字符,一个短整数或一个整数位字段(全部带符号或不带符号)或枚举类型的对象。在可以使用整数的表达式中。
如果一个int可以表示原始类型的所有值,则该值将转换为int;否则,该值将转换为unsigned int。此过程称为整体促销。
``此段落的一般想法是:无论使用什么整数,在表达式中都可以使用char,short int或int字段(所有有符号或无符号)或枚举类型的对象。如果一个int可以表示原始类型的所有值,则该值将转换为int;否则,该值将转换为unsigned int,此过程称为整体提升。
让我们以一个示例为例,了解通过整形提升的某些数据类型(例如char,short int)所占用的字节数要少于int。对它们执行操作时,这些数据类型将自动提升为int或unsigned int,例如,在不对这些类型(例如char,short和enum)进行较小的算术计算时,代码如下:1 //在win10_64bit + vs2017 2#include 3int main()4 {5 char a& n = 30,& nbsp; b& nbsp; = 40,& c& nbsp; = 10; 6个字符d ==(a) 7 printf(“%d& nbsp;”,& nbsp; d); 8系统(“ pause”); 9返回0; 10}输出结果:120直接看代码,表达式(a * b)/ c似乎引起算术溢出,因为带符号的字符只能具有从-128到127的值(在大多数C编译器中),子表达式(a * b)的值= 1200,该值大于128。
但是当对char类型执行算术运算时,会发生整数提升,并且我们得到了正确的结果而没有任何溢出。整数提升的意义尽管机器指令中可能有两个8位字节加法指令,但是通用CPU很难直接实现这种字节加法运算。
因此,表达式中各种长度可能小于int长度的整数值必须先转换为int或unsigned int,然后再发送给CPU执行操作。 CPU中整数算术单元(ALU)的操作数的字节长度通常是int的字节长度,也是CPU通用寄存器的长度。
表达式的整数运算必须在CPU的相应运算设备中执行。因此,当添加两个char类型的树时,它们在CPU中执行,因此自然需要将它们转换为CPU中整数操作数的标准长度。
应用示例:short int的长度= int的长度。 C语言标准仅规定:char的长度≤short int的长度≤int的长度。
这意味着short int和int的长度可以相等。在这种情况下,无法将Unsigned short提升为int,只能将其提升为unsigned int,代码如下:1 //在win10_64bit + vs2017 2#include 3int main(){4 char a& nbsp; = 0xb6 ; 5个简短b = 0xb600; 6 int c = 0xb6000000; 7 if(& a& nbsp; == 0xb6)printf(“ a”); 8如果(& b& nbsp; == 0xb600)printf(“ b”); 9如果(& c& nbsp; = = 0xb6000000)printf(“ c”); 10系统(“ pause”); 11}输出结果:cC语言标准未指定char类型是带符号还是无符号。
在这种情况下,编译器将char定义为带符号的char。表达式a == 0xb6由整数类型提升,其中char类型的a被提升为int类型并表示为负值,因此该表达式的结果为false;表达式b == 0xb600由整数类型提升,而short类型为b。
由于b被提升为int类型且为负值,因此该表达式的结果为false;表达式c == 0xb6000000不进行整数提升,==运算符的两个部分均为int类型的负值,结果为true。让我们考虑以下程序作为另一个示例。
1 //在win10_64bit + vs2017 2#include 3 4int main()5 {6 char a& nbsp; = 0xfb; 7个未签名的字符b = 0xfb; 8 9 printf(“ a& nbsp;%c”,& nbsp; a); 10个printf(“
b& nbsp; =& nbsp;%c“,& nbsp; b); 11 12 if(a& ==& b)13 printf(“
相同”); 1个