Cout не печатая номер - PullRequest
       27

Cout не печатая номер

16 голосов
/ 09 ноября 2011

Issue

Я не получаю вывод от простого 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)

Среда

  • Машина разработки:
    • ОСX 10.6.8
    • Компилятор LLVM 1.7
    • Xcode 3.2.6
  • Тестовая машина:
    • OS X 10.6.8

Ответы [ 3 ]

12 голосов
/ 09 ноября 2011

Он печатает 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 может отображаться show)

4 голосов
/ 09 ноября 2011

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

std::cout << (int)variableuint8;

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

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

3 голосов
/ 09 ноября 2011

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

...