【问题标题】:Why does the addition of two shorts return an int? [closed]为什么添加两个短裤会返回一个int? [关闭]
【发布时间】:2016-12-27 21:39:13
【问题描述】:

我读过一个 c++ 教程,它说算术运算符返回可能的最小数据类型(即,如果添加 2 个 int,则返回类型将为 int,如果添加 float 和 double,则返回类型将为 double)。但是,它也表示对空头的算术运算返回整数。考虑到短裤占用的内存比整数少,为什么会发生这种情况?教程有误吗?本教程适用于 c++11,所以可能在 c++14 中已弃用?谢谢!

【问题讨论】:

  • "我读过一个 c++ 教程,它说算术运算符返回可能的最小数据类型" 是否可以在线获取,以便我们查看上下文?这似乎与正确答案相反。例如1 + 2.0; 不返回int
  • 2.0 是双...
  • 不要怪语言,要怪你的架构。 (整数)c.p.u.s 中的算术处理要求操作数为ints 并返回ints。所以是的short + short 给出了intshort + int 也给出了int。这是因为你的 c.p.u。要求它们为ints 才能执行任何算术运算,结果它们被强制转换为ints,执行该操作并将结果返回为int
  • @AnirbanSarkar,该语言明确表示这是一项规则。该规则可能是基于硬件的,但实际上,该语言可以很容易地以不同方式定义它。
  • @AnirbanSarkar:严格来说这不是真的。 x86 直接支持 16 位或 8 位加法,无需扩展到整数。同样在仅支持 int 算术的硬件上,标准仍然可以指定 short+short == shortwhich is arguably a better design choice

标签: c++ c++11 c++14


【解决方案1】:

考虑到短裤占用的内存比整数少,为什么会发生这种情况?

那是因为标准是这样说的。

教程有误吗?

没有。


来自 C++11 标准(注意 通常的算术转换位):

5 种表达方式

...

9 许多期望算术或枚举类型的操作数的二元运算符会导致转换并以类似的方式产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为常用算术转换,定义如下:

...

— 否则,应在两个操作数上执行整数提升 (4.5)。

Integral promtions在标准中定义为:

4.5 整体促销

1 除boolchar16_tchar32_twchar_t 以外的整数类型的纯右值,其整数转换等级 (4.13) 小于int 的等级可以转换为纯右值类型为int 如果int 可以表示源类型的所有值;否则,可以将源纯右值转换为unsigned int 类型的纯右值。

如上所述,在将一些二元运算符应用于操作数之前,short 被提升为 int

关于运算符+- 的部分特别提到了通常的算术转换是在操作数上执行的:

5.7 加法运算符

1 加法运算符 +- 从左到右分组。对算术或枚举类型的操作数执行通常的算术转换。

【讨论】:

    【解决方案2】:

    int 类型是目标系统的“自然大小”。小于int 的整数类型在算术表达式中被提升为int,以便处理器可以最高效。如今,这可能不再那么令人担忧,但它仍然是 C 和 C++ 语言的一部分。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 2017-06-12
      • 1970-01-01
      • 2020-10-31
      • 2012-09-12
      • 2013-02-26
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多