在添加和计算时,sizeof如何适用于不同的数据类型?
#include 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 int
是short int
, short int
大小是2
。
根据C标准积分推广规则 ,表达式c + i
的类型将为int
,这就是为什么你得到的等价于sizeof (int)
,即4
。
当在某些类型的表达式中使用不同的算术类型作为操作数时,将应用称为通常算术转换的标准转换。 根据算术类型的等级应用这些转换:具有较低等级类型的操作数被转换为具有较高等级的操作数的类型。 这称为积分或浮点促销。
除此之外,根据这里 ,算术运算符不接受小于int
类型作为参数,并且自动应用整体促销。 所以即使sizeof(c+c)
你也会得到4
。
您可以从本国际标准 – 编程语言 – C,第6.3.1.1节,第2条中找到以下信息:
[…]如果intcan表示原始类型的所有值(由宽度限制,对于位字段),该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销。 整数提升仅适用于:通常算术转换的一部分,某些参数表达式,一元+, – 和〜运算符的操作数,以及移位运算符的两个操作数,由各自的子条款指定。 )[…]