Я работаю над кодом ниже:
#include<iostream>
#include<stdio.h>
using namespace std;
main() {
unsigned char a;
a=1;
printf("%d", a);
cout<<a;
}
Это печать 1 и некоторый мусор.
Почему cout
ведет себя так?
Я работаю над кодом ниже:
#include<iostream>
#include<stdio.h>
using namespace std;
main() {
unsigned char a;
a=1;
printf("%d", a);
cout<<a;
}
Это печать 1 и некоторый мусор.
Почему cout
ведет себя так?
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;
У меня была аналогичная проблема здесь, о которой я давно забыл. Разрешение этой проблемы с помощью 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 отвечает за напоминание мне об этом решении.
Вам нужно указать a
как целое число cout<< (int)(a);
. При этом вы увидите 1
на выходе. С cout << a;
печать будет SOH (Start of Heading)
, соответствующая значению ascii 1
, который не может быть напечатан, и, следовательно, наблюдается некоторый специальный символ.
ИЗМЕНИТЬ
Чтобы быть более точным, оператор cout
должен быть cout << static_cast<unsigned>(a)
, как упоминал Наваз.
Я думаю, что компилятор 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
. Таким образом, вы должны использовать спецификаторы с выходным аргументом.
Вы можете использовать:
+
перед именем выходного аргумента 'uint8_t data_byte = 100;cout << "val:" << +data_byte << endl; '
unsigned(var)
; лайк,'uint8_t data_byte = 100;
cout << "val:" << uinsigned (data_byte) << endl; '
Е ( "% U", а); его так просто попробуйте