从 std::cin 读取 int_fast8_t 时的结果令人惊讶

问题描述 投票:0回答:1

我正在尝试构建一个简单的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
c++ iostream cstdint
1个回答
1
投票

问题在于

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
代替;至少对于用户输入。

另请参阅

© www.soinside.com 2019 - 2024. All rights reserved.