#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;
}看看上面的代码,它用来观察当我在空范围外输入一个整数时会发生什么。
当我输入任何小于-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。
因此,无符号短线的范围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 .
在短的范围外输入一个整数似乎是一个很容易遵循的规则。
对于像我这样的初学者来说,在无符号短的范围之外输入一个整数是很难理解的。
在未符号空号范围外输入整数后,打印无符号短值的规则是什么?
发布于 2020-04-24 11:01:55
只需添加一个检查,以确定>>是否发出了问题信号:
#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 $事实上,如果您超出了范围,但没有考虑已签名/未签名,则会发出错误信号。
https://stackoverflow.com/questions/61406628
复制相似问题