【问题标题】:Widening and narrowing rules in C/C++C/C++ 中的扩大和缩小规则
【发布时间】:2016-11-30 14:38:25
【问题描述】:

我试图为此通读 C/C++ 标准,但找不到答案。

假设你有以下sn-p:

int8_t m;
int64_t n;

在某些时候你执行m + n,加法本身是一个二元运算符,我认为在这种情况下最有可能发生的情况是:

  1. m加宽到n的大小,调用加宽结果m_prime
  2. 执行m_prime + n
  3. 返回int64_t 类型的结果

我试图理解,但是如果我不执行 m+n 而不是执行 n+m,结果会改变(因为可能会有缩小操作而不是扩大操作)。

我找不到标准中阐明这一点的部分(我理解这可能听起来微不足道)。

谁能指出我可以在标准中找到这个的地方吗?或者在我暴露的那种情况下一般会发生什么?

就我个人而言,我一直在查看“加法运算符”部分,但在我看来并没有解释会发生什么,指针算术被涵盖了一点,但没有提及隐式应用的某些强制转换规则。

您可以假设我说的是 C++11,但我猜任何其他标准都会应用相同的规则。

【问题讨论】:

  • 没有C/C++ 标准。有一个C 标准,一个C++ 标准。两者是非常不同的文件。
  • C 基本上几乎是 C++ 的真正子集,至少 ANSI C89 是。是的,无论较小的整数是在 + 号的左侧还是右侧,您都会变宽。
  • “C 基本上几乎是 C++ 的真正子集,至少 ANSI C89 是” - 恐怕这不是真的。
  • @StoryTeller,我认为限制在我所要求的范围内可以被认为是相同的。我不明白为什么这个特定部分应该改变。
  • @StoryTeller。是真的。请注意,我说的是“几乎”。所有 K&R 书籍示例(ANSI C89 版本)都使用 C++ 编译器进行编译。我所知道的其他两种语言都没有如此密切相关的。

标签: c++ standards


【解决方案1】:

参见第 5 条表达式 [expr]。第 10 点开始

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

接下来的子点会说“如果 either 操作数是...”、“...other 应该...”、“如果两个操作数...”等

对于您的具体示例,请参阅 10.5.2

否则,如果两个操作数都是有符号整数类型或都具有无符号整数类型,则整数转换等级较小的操作数应转换为等级较大的操作数类型。

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2012-06-10
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多