【发布时间】: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 >> a;替换成if (!(std::cin >> a)) std::cout << "wrong ";看看结果 -
除了
<climits>中的C 风格USHRT_MAX宏常量,<limits>中还有C++ 风格std::numeric_limits<unsigned short>::max()。