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

3 ответов


он печатает char как персонаж.

#include <iostream>

int main() {
        unsigned char c = 0x41;
        std::cout << c << std::endl;
        return 0;
}

это печатает ' A ' в stdout.

хотя в этом случае, ваш код должен печатать Len: (*), а я проверил печати Len: (*).


Edit: поскольку в кодировках символов, таких как ASCII или UTF-8, ваша консоль, вероятно, использует, символ, соответствующий 8 (Backspace), не отображается, он будет выглядеть так, как будто он не напечатан.

(в некоторых случаях это может привести к предыдущие характера (() исчезнуть, потому что это символ backspace. В DOS это может показать ◘)


вы пытались бросить его в int, чтобы избежать зависимости от типа char, который используется реализацией:

std::cout << (int)variableuint8;

вот объяснение того, что происходит: что такое неподписанные символ?

чтобы получить идею, ваша реализация использует unsigned char as char. Код ASCII для 0x08-это символ управления backspace, и, конечно, это не печатаемый символ, поэтому вы не видите вывод в случае std::cout.


Would std::cout << "Len: (" << (unsigned short)notification->len << ")\n"; вывести правильное значение? Я думаю, что приведение к целому числу-это то, что может искать.