我正在尝试构建一个简单的cpp代码来检查输入数字是否是大于2的偶数(尝试使用cstdint实验性地解决codeforce的西瓜问题)。问题是,当我使用 int_fast8_t 作为输入整数的数据类型时,当我输入 2 作为输入时,代码以某种方式打印“yes”。当我使用基本 int 数据类型时,这个问题不存在。关于为什么会发生这种情况有什么想法吗?
代码如下:
#include <cstdint>
#include <iostream>
int main(int argc, char* argv[]) {
int_fast8_t input;
std::cin >> input;
if ((input % 2 == 0) && (input > 2)) {
std::cout << "YES";
} else {
std::cout << "NO";
} std::cout << "\n";
return 0;
}
input: 2
expected output: NO
actual output : YES
问题在于
int_fast8_t
被定义为 signed char
的类型别名。 C++ 标准不要求这样做,但这是您的标准库选择执行的操作。
您可以通过查看标准库的源代码来验证这一点,或者使用:
static_assert(std::is_same_v<std::int_fast8_t, signed char>>);
结果,你实际上在做的是:
signed char input;
std::cin >> input;
operator>>(std::istream&, signed char&)
,这是一个特殊的重载,它将 signed char
视为字符,而不是整数。
当提供
2
作为用户输入时,这实际上是 ASCII/UTF-8 字符 '2'
,其数值为 50
。
这通过了测试
input % 2 == 0
,因为 50
可被 2
整除,并且也通过了 input > 2
测试,因为 50
大于 2
。
要解决此问题,请使用
int
代替;至少对于用户输入。