为什么std :: cout没有为我的int8_t数字打印正确的值?

时间:2011-09-28 18:29:27

标签: c++ gdb cout

我有类似的东西:

int8_t value;
value = -27;

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

当我运行我的程序时,我得到一个错误的随机值<E5>输出到屏幕,但是当我在gdb中运行程序并使用p value时,它打印出-27,这是正确的值。有没有人有任何想法?

4 个答案:

答案 0 :(得分:21)

由于int8_tsigned char相同,因此流不会将char视为数字。投入到例如int16_t

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

你会得到正确的结果。

答案 1 :(得分:3)

最有可能是int8_t

typedef char int8_t

因此,当您使用stream out“value”时,将打印基础类型(char)。

打印“整数”的一个解决方案是在流式传输int8_t之前键入强制转换值:

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

答案 2 :(得分:2)

这是因为int8_t与 signed char。

同义

因此该值将显示为char值。

要强制显示,您可以使用

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

这将有效,只要您不需要特殊格式,例如

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

在这种情况下,您将从扩大的大小中获取工件,特别是如果char值为负(对于(int)(int8_t)-1而不是FF,您将获得FFFFFFFF或FFFF 1 )< / p>

编辑另请参阅这篇非常易读的文章,该文章详细介绍并提供了更多与此相关的策略:http://blog.mezeske.com/?p=170


<子> 1 取决于架构和编译器

答案 3 :(得分:1)

看起来它正在将值打印为字符 - 如果使用'char value;'相反,它打印相同的东西。 int8_t来自C标准库,因此可能是cout没有为它做好准备(或者它只是对char的typedefd)。