【问题标题】:Why does "unsigned int" + "unsigned int" return an "unsigned int"?为什么“unsigned int”+“unsigned int”会返回“unsigned int”?
【发布时间】:2019-05-13 13:19:38
【问题描述】:

我相信当您将两个unsigned int 值相加时,返回值的数据类型将是unsigned int

但是两个unsigned int 值相加可能会返回一个大于unsigned int 的值。

那么为什么unsigned int + unsigned int 返回unsigned int 而不是其他更大的数据类型?

【问题讨论】:

  • 如果你把它们加在一起你会得到另一个更大的数据类型?所以你的程序中有 100 行内存不足?
  • 如果你需要处理溢出,你必须将它编程到你的代码中。
  • unsigned int + unsigned int 永远不能大于 unsigned int,因为所有数学运算都是以 2^unsigned int bits 为模完成的
  • 当你做int + int它也可能溢出。该返回应该说long long int吗?
  • 那么为什么unsigned + unsigned 会返回unsigned 这就是它在语言中的定义方式。原因可能是底层硬件可能会这样做。虽然,CPU 可能有一个进位标志来存储溢出,但这并没有反映在 C++ 中。

标签: c++ types


【解决方案1】:

这将产生真正邪恶的后果:

真的希望 1 + 1 成为 long 类型吗?而(1 + 1) + (1 + 1) 会变成long long 类型吗?它会对类型系统造成严重破坏。

例如,shortintlonglong long 的大小也可能相同,unsigned 版本的大小也可能相同。

因此,目前的隐式类型转换规则可能是最好的解决方案。

你总是可以用类似的东西来解决问题

0UL + "unsigned int" + "unsigned int"

【讨论】:

    【解决方案2】:

    假设我们有一种语言,两个整数相加会产生更大的类型。因此,将两个 32 位数字相加得到一个 64 位数字。下面的表达式会发生什么?

    auto x = a + b + c + d + e + f + g;
    

    a + b 是 64 位。 a + b + c 是 128 位。 a + b + c + d 是 256 位...这很快就会变得难以管理。大多数处理器不支持具有如此宽操作数的操作。

    【讨论】:

    • 我不记得名字了,但是有一个 C++ 库可以使用模板参数跟踪数字的最大大小。并且它不会很快变得难以管理,因为添加 32 位的 7 个数字最多只需要 35 位。您可以使用 64 位数字来保存 35 位。不过,它可能会很快变得难以管理,具体取决于操作。
    • @nwp 很公平。通过表达式而不是仅跟踪表达式的类型来跟踪最大潜在位数将允许保持某些表达式(例如示例)可维护。你见过生产中使用的那个库吗?
    • 我再也找不到了。我记得cppcast的一位客人谈到它。但即使我确实找到了它,我也会将“用于生产”视为无关紧要的属性。
    • 未在世界任何地方用于生产是一个巨大的信号,而不是无关紧要的属性。
    • 无论如何这不是重点。这样的库可能在生产中使用,但它是一个专门的库,处理特定用途的大整数。将其用于常规算术会导致巨大的性能损失。
    【解决方案3】:

    变量的类型不仅决定了它可以容纳的值的范围,而且马虎地说,还决定了操作是如何实现的。如果您添加两个 unsigned 值,您将获得 unsigned 结果。如果你想要一个不同的类型作为结果(例如long unsigned)你可以转换:

    unsigned x = 42;
    unsigned y = 42;
    long unsigned z = static_cast<long unsigned>(x) + static_cast<long unsigned>(y);
    

    其实真正的原因是:它是这样定义的。特别是无符号溢出在 C++ 中被很好地定义为环绕并为unsigned 运算符的结果使用更广泛的类型会破坏这种行为。

    作为一个人为的例子,考虑这个循环:

    for (unsigned i = i0; i != 0; ++i) {}
    

    注意条件!让我们假设i0 &gt; 0,那么只有在增加unsigned 的最大值时它才会为假,结果0。这段代码被混淆了,可能会让你在代码审查中挑起一两个眉毛,尽管它是完全合法的。根据结果​​的值调整结果类型,或者选择不会发生溢出的结果类型会破坏这种行为。

    【讨论】:

      【解决方案4】:

      因为一个变量+一个相同类型的变量只能等于那个类型的变量, (在某些情况下会,但在你的情况下不会)

      示例:

      int + int = int 一个 int 加上另一个 int 不能等于一个浮点数,因为它没有浮点数的属性。 我希望这能回答你的问题!

      【讨论】:

      • 理论上不错,但char + charshort + short 都被提升为int(在某些平台上,unsigned int 可能是char)。
      • 一般TS的某些类型,T() + S()可以产生任何类型,operator+的结果是完全相同的类型甚至可能是例外
      • 你是对的,但在我的例子中 a 说 a + a = a 不是 a + b = a plus @elijay 你是对的,我道歉
      猜你喜欢
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2016-02-26
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2018-08-25
      相关资源
      最近更新 更多