Cout не печатает номер
Проблема
Я не получаю выход из простого cout, тогда как printf всегда печатает номер:
std::cout << variableuint8; // prints nothing
printf("%u", variableuint8); // prints the number
Я никогда не сталкивался с этим поведением раньше, и, хотя у меня есть работа, я хотел бы это понять.
Контекст:
Yay, указатели. Так что это может быть немного больше, чем указано. Здесь контекст - я не думаю, что это должно иметь значение, к тому времени, когда cout и printf получат информацию, которую он разыменовал простым прошитым char. Это, вероятно, больше информации, чем нужно для решения проблемы, но я хотел быть полностью уверенным, что это было важно.
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
- Тест-машина:
Ответы
Ответ 1
Он печатает 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 он может показывать ◘)
Ответ 2
Будет ли std::cout << "Len: (" << (unsigned short)notification->len << ")\n";
напечатать правильное значение? Я думаю, что отбрасывание целого числа - это то, что можно искать.
Ответ 3
Вы пытались включить его в int, чтобы избежать зависимости от типа char, который используется при реализации:
std::cout << (int)variableuint8;
Вот объяснение того, что происходит: Что такое unsigned char?
Чтобы понять, ваша реализация использует unsigned char
как char
. Код ASCII для 0x08 является символом управления обратным пространством, и, конечно, это не печатный символ, поэтому вы не видите вывод в случае std::cout
.