Cout не печатая номер
вопрос
Я не получаю вывод от простого cout, тогда как printf всегда будет печатать число:
std::cout << variableuint8; // prints nothing
printf("%u", variableuint8); // prints the number
Я никогда не сталкивался с таким поведением раньше, и хотя у меня есть работа вокруг, я хотел бы понять это.
Контекст:
Уу, указатели. Так что это может быть немного более сложным, чем заявлено. Вот контекст - я не думаю, что это должно иметь значение, к тому моменту, когда cout и printf получат информацию, которую разыменовывают к простому неподписанному символу. Это, вероятно, больше информации, чем необходимо для решения проблемы, но я хотел бы закончить на случай, если это актуально.
typedef unsigned char UInt8;
typedef unsigned short UInt16;
typedef struct{
UInt8 len;
// some other definitions. sizeof(DeviceNotification) <= 8
}DeviceNotification;
UInt8 somerandomdata[8];
DeviceNotification * notification;
notification = (DeviceNotification *) somerandomdata;
std::cout << "Len: (" << notification->len << ")\n";
printf("Len: (%u)\n", notification->len);
Случайные данные инициализируются в другом месте. Для этого вывода первый байт в массиве - 0x08:
Выход:
Len: ()
Len: (8)
Среда
- Разработка машины:
- OS X 10.6.8
- Компилятор LLVM 1.7
- Xcode 3.2.6
- Тестовая машина:
- OS X 10.6.8
3 ответа
Это печать char
как персонаж.
#include <iostream>
int main() {
unsigned char c = 0x41;
std::cout << c << std::endl;
return 0;
}
Это выводит "A" на стандартный вывод.
Хотя в этом случае ваш код должен напечатать Len: (*)
и я проверил это печатает Len: (*)
,
Редактировать: Поскольку в кодировках символов, таких как ASCII или UTF-8, вероятно, используется ваша консоль, символ, соответствующий 8 (Backspace), не виден, он будет выглядеть так, как будто он не напечатан.
(В некоторых случаях это может вызвать предыдущий символ ((
) исчезнуть, потому что это символ возврата. В DOS это может показать ◘)
Вы пытались привести его к int, чтобы избежать зависимости от типа char, который используется реализацией:
std::cout << (int)variableuint8;
Вот объяснение того, что происходит: что такое беззнаковый символ?
Чтобы понять, ваша реализация использует unsigned char
как char
, Код ASCII для 0x08 является управляющим символом возврата, и, конечно, это не печатный символ, поэтому вы не видите вывод в случае std::cout
,
Было бы std::cout << "Len: (" << (unsigned short)notification->len << ")\n";
вывести правильное значение? Я предполагаю, что приведение к целому числу - это то, что можно искать.