Cout not print unsigned char

Я работаю над кодом ниже:

#include<iostream>
#include<stdio.h>

using namespace std;

main() {
    unsigned char a;
    a=1;
    printf("%d", a);
    cout<<a;
}

Это печать 1 и некоторый мусор.

Почему cout ведет себя так?

Ответ 1

cout << a печатает значение, которое кажется вам мусором. На самом деле это не мусор. Это просто непечатный символ ASCII, который в любом случае печатается. Обратите внимание, что символ ASCII, соответствующий 1 предназначен для печати. Вы можете проверить, является ли можно печатать или не использовать, a std::isprint как:

std::cout << std::isprint(a) << std::endl;

Он напечатает 0 (читай: false), указывая, что символ не может быть напечатан

-

В любом случае, если вы хотите, чтобы ваш cout напечатать 1 также, затем отливали к этому: a

cout << static_cast<unsigned>(a) << std::endl;

Ответ 2

У меня была аналогичная проблема здесь, о которой я давно забыл. Разрешение этой проблемы с помощью iostream's cout может быть выполнено следующим образом:

#include<iostream>
#include<stdio.h>

main() {
    unsigned char a;
    a=1;
    printf("%d", a);
    std::cout<< +a << std::endl;

    return 0;
}

вместо того, чтобы вернуть его другому типу, если вы хотите cout напечатать значение unsigned char в отличие от символа ascii. Вам нужно promote его.

Если вы заметили все, что я сделал, добавьте + до unsigned char. Это унарное дополнение, которое будет способствовать unsigned char, чтобы дать вам фактическое представление числа.

Пользователь Baum mit Augen отвечает за напоминание мне об этом решении.

Ответ 3

Вам нужно указать a как целое число cout<< (int)(a);. При этом вы увидите 1 на выходе. С cout << a; печать будет SOH (Start of Heading), соответствующая значению ascii 1, который не может быть напечатан, и, следовательно, наблюдается некоторый специальный символ.

ИЗМЕНИТЬ

Чтобы быть более точным, оператор cout должен быть cout << static_cast<unsigned>(a), как упоминал Наваз.

Ответ 4

Я думаю, что компилятор C имеет свой собственный способ определения типа печатного вывода, потому что вы можете указать тип вывода.

Пример: 'uint8_t c = 100;

Е ( "% d", с); , so you can also print c as an int by % d , or char % c , string % s or a hex value % x '.

Там, где C++ имеет свой собственный путь, я думаю, что cout по умолчанию печатает 8-битные значения как char. Таким образом, вы должны использовать спецификаторы с выходным аргументом.

Вы можете использовать:

  1. + перед именем выходного аргумента 'uint8_t data_byte = 100;

cout << "val:" << +data_byte << endl; '

  1. использовать функцию приведения unsigned(var); лайк,

'uint8_t data_byte = 100;

cout << "val:" << uinsigned (data_byte) << endl; '

Ответ 5

Е ( "% U", а); его так просто попробуйте