C 语言整数提升

17 Mar 2025 | 4 分钟阅读

在C语言中,我们使用很多数据类型,如整型(integers)、浮点型(float)、短整型(short)、字符型(character)等。每种数据类型都有其自己的字节大小和可以表示的数值范围。

例如,一个整型变量占用4个字节,而一个字符型变量占用2个字节的内存。整型是最常用的数据类型之一,因为我们可以轻松地对其进行算术运算。当我们对非整型变量(如字符型或短整型)进行算术运算时,编译器会将它们视为整型变量,并将其转换为等效的整数值。这种现象称为整数提升。

C 语言示例

输出

Integer Promotions in C

说明

在上面的代码中,我们有三个字符型变量var1、var2和var3。我们用值54初始化了var1,用值48初始化了var2。现在,由于我们用整数值初始化了字符型变量,这些变量被提升为整数,我们可以轻松地对这些变量进行算术运算。

我们有第三个变量var3,它将存储var1和var2的和,因此它将存储值54+48 = 102,我们将把它作为整数打印出来。

我们知道,一个有符号字符型变量的范围是从-128到+127,而无符号格式的范围是从0到255,因为字符型占用1字节的内存,等于8位,可以用上述范围的有符号和无符号格式表示。

如果我们讨论一个整型变量,它占用4个字节的内存或32位。因此,有符号格式的变量范围是从-2147483648到2147483647,而无符号格式的范围是从0到4294967295。

如果我们分配任何超出其范围的数字,就可能发生溢出,我们可以通过一个例子来理解它。

C 语言示例

输出

Integer Promotions in C

说明

在上面的代码中,我们给var1赋了值-129,这个值小于字符型的范围,因此会发生溢出,值127将被赋给var1。现在,var2的值是48,我们将这些值相加并赋给var3,结果将是127+48 = 175。因此var3中的值会溢出,它将被重新赋值为-81。

Integer Promotions in C

注意:默认情况下,变量的整数提升是在有符号格式下完成的。如果我们使用一个无符号变量,我们可能会得到一个有符号格式的值。

C 语言示例

输出

Integer Promotions in C

说明

在上面的例子中,我们有三个字符型变量var1、var2和var3。Var1是一个无符号字符,被赋值为152,而var2是一个有符号字符,也被赋值为152。如果var1和var2相等,var3将存储其中一个值;否则,它将存储值0。由于var1是一个无符号字符,其范围是从0到255,赋值为152。Var2是一个有符号变量,所以会发生溢出,赋给它的值将是-104。

所以var1不等于var2,var3将得到值0或false。

对于短整型变量的整数提升,我们有相同的规则。因为一个短整型变量占用2个字节或16位的内存。所以一个无符号短整型变量的范围是0到65535,而有符号变量的范围是从-32768到+32767。

C 语言示例

输出

Integer Promotions in C

说明

var1被赋值为40546,这在无符号短整型的范围内,而var2有相同的值,但它溢出了,将被赋值为-24990。所以,var1和var2不相等,var3被赋值为0或false。