c++ - 在输入一个超出无符号短整数范围的整数后,打印无符号短整数值的规则是什么?
问题描述
#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 值的规则是什么?
解决方案
只需添加检查以了解是否>>
发出问题信号:
#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 $
实际上,如果您超出范围但不考虑签名/未签名,则会发出错误信号
推荐阅读
- ubuntu - Python 进程不会分配超过 20GB 的 RAM
- .net - 为 Kentico Cloud API 和 .NET 设置控制器和视图
- kubernetes - authentication handshake failed: x509: certificate signed by unknown authority
- typescript - 如何声明局部类型扩充?
- cloud-foundry - Cloudfoundry 重载终端信号
- javascript - Apollo GraphQL, is there a way to manipulate the data that is being written to the cache during querying?
- python - Creating a matrix from the data inside the csv
- java - 从目录路径创建 IJavaProject
- excel - VBA - 将范围的内容保存到文件中
- kubernetes - Kubernetes Istio 入口网关总是以 503 响应