如何在不使用char行为的同时将uint8_t与I / O流一起使用?

问题描述 投票:2回答:2

考虑这个简单的C ++程序:

#include <cstdint>
#include <iostream>

int main() {
    uint8_t var;
    std::cin >> var;
    std::cout << "var = " << var << '\n';
    if (var == 1) {
        std::cout << "var is 1\n";
    } else {
        std::cout << "var is not 1\n";
    }
}

运行它显示出一些令人惊讶的行为。当输入为1时,the output is

var = 1
var is not 1

这显然是荒谬的!经过许多不同的测试后,我意识到发生了什么事情it's reading and writing a char!仍然不是我想要的行为–我使用了char,因为我想要uint8_t eger行为。 在执行流I / O时如何使int表现得与其他整数类型一样?或者,我应该使用哪种单字节类型

c++ io integer iostream
2个回答
3
投票

您需要转换为uint8_t

int

或更短时间(C风格):

std::cout << "var = " << static_cast<int>(var) << '\n';

或更短的时间(使用算术运算符提升为std::cout << "var = " << (int)var << '\n'; :]

int

1
投票

在执行流I / O时如何使uint8_t表现得与其他整数类型一样?

您不能。 std::cout << "var = " << +var << '\n'; 可以。

如果Apparentlystd::uint8_t的别名,通常(也许总是),则它是一种字符类型,标准流将其视为字符类型。

您可以在将其插入流之前将其转换为非字符整数类型:

unsigned char

或带有中间变量:

 std::cout << "var = " << static_cast<unsigned>(var) << '\n';

流提取仅适用于中间变量方法:

unsigned temp = var;
std::cout << "var = " << temp << '\n';

在相关说明中,如果您希望输出变量的地址,则unsigned temp; std::cin >> temp; var = temp; 将不起作用,因为它将被视为以null终止的字符串...该字符串不是,因此导致未定义行为。为此,您可以使用std::cout << &var;

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