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"; вывести правильное значение? Я предполагаю, что приведение к целому числу - это то, что можно искать.

Другие вопросы по тегам