【问题标题】:What are the rules for printing an unsigned short value after entering an integer outside of the range of unsigned short?输入一个超出无符号短整数范围的整数后,打印无符号短整数值的规则是什么?
【发布时间】:2020-04-24 10:49:50
【问题描述】:
#include <iostream>
#include <climits>
int main(void) {
    std::cout << SHRT_MIN << std::endl;
    std::cout << SHRT_MAX << std::endl;
    //-32768 ~ 32767 is the range
    short a;
    std::cin >> a;
    std::cout << "decimal: " << a << std::endl;//decimal
    return 0;
}

看上面的代码,用来观察当我输入一个超出short范围的整数时会发生什么。

当我输入任何小于 -32768 的整数时,例如 -3333333,将打印 -32768。

当我输入任何大于 32767 的整数时,例如 3333333,将打印 32767。

现在我想看看当我输入一个超出无符号短裤范围的整数时会发生什么。

代码如下:

#include <iostream>
#include <climits>
int main(void) {
    std::cout << USHRT_MAX << std::endl;
    unsigned short a;
    std::cin >> a;
    std::cout << "decimal: " << a << std::endl;//decimal
    return 0;
}

似乎没有USHRT_MIN,但我认为最小的是0。

所以 unsigned short 0 ~ 65535 的范围就是范围。

当我输入任何大于 65535 的整数时,例如 3333333,将打印 65535。

现在让我很困惑的部分来了。

当我输入一个小于 0 的整数时,

-1, decimal: 65535
-2, decimal: 65534
-3, decimal: 65533
-4, decimal: 65532
...
-65534, decimal: 2
-65535, decimal: 1
-65536, decimal: 65535
-65537, decimal: 65535
-65538, decimal: 65535
-65539, decimal: 65535
-3333333, decimal: 65535

从 -1 到 -65535,a 的打印值似乎有一个模式。

从 -65536 到任何更小的负整数,a 的打印值始终保持 65535。

输入一个超出 short 范围的整数似乎是一个非常容易遵循的规则。

现在像我这样的初学者很难理解输入一个超出 unsigned short 范围的整数。

输入一个超出 unsigned short 范围的整数后,打印 unsigned short 值的规则是什么?

【问题讨论】:

  • std::cin &gt;&gt; a;替换成if (!(std::cin &gt;&gt; a)) std::cout &lt;&lt; "wrong ";看看结果
  • 除了&lt;climits&gt; 中的C 风格USHRT_MAX 宏常量,&lt;limits&gt; 中还有C++ 风格std::numeric_limits&lt;unsigned short&gt;::max()

标签: c++ integer range short


【解决方案1】:

只需添加检查以了解&gt;&gt; 是否表示问题:

#include <iostream>
#include <climits>

int main(void) {
    std::cout << USHRT_MAX << std::endl;
    unsigned short a;
    if (!(std::cin >> a))
      std::cout << "wrong ";
    std::cout << "decimal: " << a << std::endl;//decimal
    return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
65535
-1
decimal: 65535
pi@raspberrypi:/tmp $ ./a.out
65535
-2
decimal: 65534
pi@raspberrypi:/tmp $ ./a.out
65535
70000
wrong decimal: 65535
pi@raspberrypi:/tmp $ ./a.out
65535
-70000
wrong decimal: 65535
pi@raspberrypi:/tmp $

事实上,如果您超出范围但不考虑签名/未签名,则会发出错误信号

【讨论】:

  • 输入-1时,答案错误。为什么没有信号?
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 2013-02-16
  • 2021-05-12
  • 1970-01-01
  • 2014-04-29
  • 2011-08-10
  • 2010-09-19
  • 2013-10-02
相关资源
最近更新 更多