Как использовать uint8_t с потоками ввода / вывода, избегая при этом поведения char? - PullRequest
2 голосов
/ 18 октября 2019

Рассмотрим эту простую программу на 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, , вывод

var = 1
var is not 1

, что явно абсурдно! После нескольких разнообразных тестов я понял, что происходит - это чтение и запись char! Тем не менее, это не то поведение, которое я хочу - я использовал uint8_t, потому что я хочу int egerповедение. Как я могу заставить uint8_t вести себя как другие целочисленные типы при выполнении потокового ввода-вывода? В качестве альтернативы, , какой однобайтовый тип я должен использовать вместо ?

Ответы [ 2 ]

3 голосов
/ 18 октября 2019

Как заставить uint8_t вести себя как другие целочисленные типы при потоковом вводе / выводе?

Вы не можете. Видимо вы можете.

Если std::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;

В связанной заметке, если вы хотите вывести адрес переменной, то std::cout << &var; не будет работать, поскольку она будет рассматриваться какстрока с нулевым символом в конце ... которой это не так и, следовательно, приводит к неопределенному поведению. Для этого вы можете использовать std::cout << static_cast<void*>(&var);.

3 голосов
/ 18 октября 2019

Вам необходимо привести к int:

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

или короче (в стиле C):

std::cout << "var = " << (int)var << '\n';   //or:
std::cout << "var = " << int(var) << '\n';   //constructor-like

или даже короче (повышение до int с арифметикойоператор):

std::cout << "var = " << +var << '\n';
...