在添加和计算时,sizeof如何适用于不同的数据类型?

时间:2014-01-24 18:33:18

标签: c sizeof

#include <stdio.h>

int main()
{
    short int i = 20;
    char c = 97;
    printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
    return 0;
}

此代码的输出是

2, 1, 4

据我说它应该是

2, 1, 2

因为char + short intshort intshort int的尺寸为2

1 个答案:

答案 0 :(得分:6)

根据C标准integral promotion rules,表达式c + i的类型将为int,这就是为什么你得到sizeof (int)的等价物,即{{1 }}

  

当在某些类型的表达式中使用不同的算术类型作为操作数时,将应用称为常规算术转换的标准转换。根据算术类型的等级应用这些转换:具有较低等级类型的操作数被转换为具有较高等级的操作数的类型。这称为积分或浮点促销。

enter image description here

除此之外,根据here,算术运算符不接受小于4的类型作为参数,并自动应用整数提升。因此,即使是int,您也会获得4

您可以从This International Standard - Programming languages — C, Section 6.3.1.1, Clause 2找到以下信息:

  

[...]如果intcan表示原始类型的所有值(受宽度限制,对于位域),该值将转换为int;否则,它将转换为无符号   INT。这些被称为整数促销。整数提升仅适用于:通常算术转换的一部分,某些参数表达式,一元+, - 和〜运算符的操作数,以及移位运算符的两个操作数,如各自的子条款所指定。 )[...]