【问题标题】:Why is std::cout not printing the correct value for my int8_t number?为什么 std::cout 没有为我的 int8_t 数字打印正确的值?
【发布时间】:2011-09-28 18:29:27
【问题描述】:

我有类似的东西:

int8_t value;
value = -27;

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

当我运行我的程序时,我得到一个错误的随机值 &lt;E5&gt; 输出到屏幕上,但是当我在 gdb 中运行程序并使用 p value 时,它打印出 -27,这是正确的值。有人有什么想法吗?

【问题讨论】:

标签: c++ gdb cout


【解决方案1】:

因为int8_tsigned char 相同,并且char 不会被流视为数字。铸造成例如int16_t

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

你会得到正确的结果。

【讨论】:

  • 因为 int16_t 的类型可能不是整数(正如流所理解的那样),也许你应该使用int
【解决方案2】:

这是因为 int8_t 是 signed char 的同义词。

因此该值将显示为 char 值。

要强制 int 显示,您可以使用

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

只要您不需要特殊格式,这将起作用,例如

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

在这种情况下,您会从扩大的尺寸中得到伪影,特别是如果 char 值为负数(对于(int)(int8_t)-1,您会得到 FFFFFFFF 或 FFFF1 而不是 FF)

编辑另请参阅这篇非常易读的文章,该文章更详细并提供了更多“处理”此问题的策略:http://blog.mezeske.com/?p=170


1 取决于架构和编译器

【讨论】:

    【解决方案3】:

    很可能int8_t

    typedef char int8_t
    

    因此,当您使用流输出“值”时,将打印基础类型(字符)。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-06
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多