【问题标题】:Unsigned integer in C++ [duplicate]C ++中的无符号整数[重复]
【发布时间】:2017-09-06 21:09:04
【问题描述】:

我写了以下代码:

 #include <iostream>
using namespace std;
int main() {

   unsigned int i=1;
   i=i-3;
   cout<<i;
   return 0;
}

输出是垃圾值,可以理解。
现在我编写以下代码:

    #include <iostream>
    using namespace std;
    int main() {

    unsigned int i=1;
    i=i-3;
    i=i+5;
    cout<<i;
    return 0;
}

现在输出为 3。这里发生了什么?这里的垃圾值是怎么加5的?

【问题讨论】:

标签: c++ integer-overflow unsigned-integer


【解决方案1】:

想想unsigned int 的值被绘制在一个大钟面上,最大可能值 (UINT_MAX) 接近于零。

从 1 中减去 3 会使时钟向后移动 3 位(这会得到 UINT_MAX - 1),然后再加上 5 会使时钟向前移动 5 位。

最终效果是将 2 加到 1,但重要的是要知道 intermediate 值完全由 C++ 标准定义。它不是垃圾,而是与你平台上UINT_MAX的值有关。

请注意,这种溢出的明确性质不适用于signed 类型。溢出 signed 类型的行为在 C++ 中是 undefined

【讨论】:

  • 我应该考虑0和INT_MAX 1之间的区别吗?
  • 你的意思是 UINT_MAX 吗?如果是这样,则认为 0 和 UINT_MAX 之间的差异为 -1。然后,您与无符号算术一致。将值 -1 分配给 unsigned 类型被定义为产生 UINT_MAX。
  • 是的,UINT_MAX。我提到 1 是 0 和 UINT_MAX 之间的绝对差。现在很清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2018-08-18
  • 1970-01-01
相关资源
最近更新 更多