【问题标题】:Why does sizeof(char + char) return 4?为什么 sizeof(char + char) 返回 4?
【发布时间】:2025-11-21 05:40:28
【问题描述】:
char  a, b;     
printf("%d", sizeof(a+b));

printf 会在屏幕上写什么?

我以为因为sizeof(char)=1,所以sizeof(a+b)也会是1,结果竟然是4。我不明白,为什么加2会写4字符?

【问题讨论】:

  • 您期待什么?您从 sizeof 运算符中读到了什么?
  • 我希望它返回 1。我知道它返回类型或变量的大小(以字节为单位),更准确地说是可以容纳在那里的字符数。
  • a+b 是一个整数求值。
  • @BoPersson 不是重复的:'a' 已经是int,但这个问题是关于chars 的整数提升。

标签: c char sizeof


【解决方案1】:

在 C 语言中,几乎所有算术运算符的操作数都经过隐式转换,称为通常的算术转换,在这种情况下,称为整数提升char 类型的操作数被提升为 int 类型,并且实际添加在 int 的域内执行(或 unsigned int,取决于该平台上 char 的属性)。所以你的a + b实际上被解释为(int) a + (int) b。结果的类型为int,而sizeof(int) 在您的平台上显然是4。那 4 就是你所看到的。

并且不要使用%dprintf sizeof 的结果。 sizeof 的结果类型为 size_t,而 %d 需要 int 参数。所以,要么使用正确的格式说明符

printf("%zu\n", sizeof(a+b));

或者如果你确定它适合的话,至少要转换它

printf("%d\n", (int) sizeof(a+b));

【讨论】:

  • 从未听说过整体促销
  • @chux - 这是旧的 C90 术语 - 正式的标准术语是整数提升。请参阅herehere 了解更多信息
  • @Chris 我明白了:--> “Integral Promotions”是旧的 C90 术语,正式的标准术语是 integer Promotions。
  • 谢谢,如果 a 和 b 是浮点数,并且 sizeof(float)=4,sizeof(a+b) 会返回什么?它会提升/降级它还是保持浮动?
  • @Nebeski:float 未被提升。回到某些古老的 C 预标准版本 float 曾经被无条件地提升为 double。但这个想法在 C89/90 发布之前就被放弃了。在标准 C 中,float 在此类表达式中不会提升为 double。 (当将参数传递给带有未声明参数的函数时,float 会隐式转换为 double。)
【解决方案2】:

这与sizeof(char)不同,参数(即加法的结果)被提升为int,所以sizeof(a + b)实际上等价于sizeof(int)。如果您将结果转换为char,这将是您所期望的。此外,sizeof 结果的正确格式说明符 size_t%zu 而不是 %d

试试

printf("%zu", sizeof((char) (a + b)));

【讨论】: