C语言中的整数提升

    有些数据类型(如char、short int)占用的字节数比int少,当对这些数据类型执行操作时,它们会自动升级为int或unsigned int。这称为整数提升。例如,在char、short和enum等较小类型上不会进行算术计算。首先将它们转换为int或unsigned int,然后对它们进行算术运算。如果int可以表示原始类型的所有值,则该值将转换为int。 否则,它将转换为unsigned 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”。
    当作为char格式时,“ a”和“ b”具有相同的二进制表示形式。 但是,当对“ a”和“ b”执行比较操作时,它们首先会转换为int。“a”是一个带符号的字符,当将其转换为int时,其值变为-5(带符号的值0xfb)。“b”是无符号字符,当将其转换为int时,其值变为251。值-5和251具有不同的int表示形式,因此我们得到的输出为“Not Same”。

参考文档

[1]Abhay Rathi.Integer Promotions in C[EB/OL].https://www.geeksforgeeks.org/integer-promotions-in-c/,2017-05-28.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值