1. 主页
  2. 文档
  3. C语言教程
  4. C语言数据类型
  5. C中的整数提升

C中的整数提升

某些数据类型,如charshort int占用的字节数比int 少,当对它们执行操作时,这些数据类型会自动提升为intunsigned int。这称为整数提升。例如,在charshortenum等较小的类型上不会发生算术计算。它们首先被转换为intunsigned int,然后对它们进行算术运算。如果int可以表示原始类型的所有值,则该值将转换为int。否则,将其转换为无符号整数。

例如看下面的程序。

#include <stdio.h> 
int main()
{
char a = 30, b = 40, c = 10;
char d = (a * b) / c;
printf ("%d ", d); 
return 0;
}

输出:

120

乍一看,表达式 (a*b)/c 似乎会导致算术溢出,因为有符号字符只能具有从 -128 到 127 的值(在大多数 C 编译器中),并且子表达式 ‘(a*b) 的值’ 是 1200,大于 128。但是整数提升发生在对 char 类型进行的算术运算中,我们得到适当的结果而没有任何溢出。

考虑以下程序作为另一个示例

#include <stdio.h>

int main()
{
char a = 0xfb;
unsigned char b = 0xfb;

printf("a = %c", a);
printf("\nb = %c", b);

if (a == b)
printf("\nSame");
else
printf("\nNot Same");
return 0;
}

输出:

a = ?
b = ?
Not Same

当我们打印 ‘a’ 和 ‘b’ 时,打印的是相同的字符,但是当我们比较它们时,我们得到的输出是“Not Same”。
‘a’ 和 ‘b’ 具有与char相同的二进制表示。但是当对’a’和’b’进行比较操作时,它们首先被转换为int。’a’ 是signed char,当它转换为int 时,其值变为 -5(有符号值为 0xfb)。’b’ 是unsigned char,当它转换为int 时,它的值变为 251。值 -5 和 251 作为int 的表示不同,因此我们得到的输出为“Not Same”。

我们将很快讨论有符号和无符号、int 和 long int 等之间的整数转换规则。

 

这篇文章对您有用吗? 1