Почему std :: cout не печатает правильное значение для моего номера int8_t? - PullRequest
11 голосов
/ 28 сентября 2011

У меня есть что-то вроде:

int8_t value;
value = -27;

std::cout << value << std::endl;

Когда я запускаю свою программу, на экран выводится неправильное случайное значение <E5>, но когда я запускаю программу в gdb и использую p value, она выводит -27, что является правильным значением. У кого-нибудь есть идеи?

Ответы [ 4 ]

21 голосов
/ 28 сентября 2011

Поскольку int8_t совпадает с signed char, а char не рассматривается потоком как число. В ролях, например int16_t

std::cout << static_cast<int16_t>(value) << std::endl;

и вы получите правильный результат.

3 голосов
/ 28 сентября 2011

Скорее всего int8_t это

typedef char int8_t

Поэтому, когда вы используете stream out "value", базовый тип (символ) печатается.

Одно из решений для получения «целого числа» - набрать приведенное значение перед передачей int8_t:

std::cout << static_cast<int>(value) << std::endl;
2 голосов
/ 28 сентября 2011

Это потому, что int8_t является синонимом со знаком char.

Таким образом, значение будет показано как значение символа.

Для принудительного отображения int вы можете использовать

std::cout << (int) 'a' << std::endl;

Это будет работать, если вам не требуется специальное форматирование, например,

std::cout << std::hex << (int) 'a' << std::endl;

В этом случае вы получите артефакты из расширенного размера, особенно если значение символа отрицательное (вы получите FFFFFFFF или FFFF 1 для (int)(int8_t)-1 вместо FF)

Редактировать см. Также эту очень удобочитаемую рецензию, которая более детально описана и предлагает больше стратегий для решения этой проблемы: http://blog.mezeske.com/?p=170


1 в зависимости от архитектуры и компилятора

1 голос
/ 28 сентября 2011

Похоже, что оно печатает значение в виде символа - если вы используете 'char value;' вместо этого он печатает то же самое. int8_t из стандартной библиотеки C, поэтому может случиться так, что cout к нему не подготовлен (или это просто typedefd to char).

...