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
  • Тест-машина:
    • OS X 10.6.8

Ответы

Ответ 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.