首页 > 解决方案 > 在输入一个超出无符号短整数范围的整数后,打印无符号短整数值的规则是什么?

问题描述

#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 值的规则是什么?

标签: c++integerrangeshort

解决方案


只需添加检查以了解是否>>发出问题信号:

#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 $

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


推荐阅读