Это потому, что 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 в зависимости от архитектуры и компилятора