【问题标题】:cout not printing unsigned charcout 不打印无符号字符
【发布时间】:2013-03-13 04:34:30
【问题描述】:

我正在处理以下代码:

#include<iostream>
#include<stdio.h>

using namespace std;

main() {
    unsigned char a;
    a=1;
    printf("%d", a);
    cout<<a;
}

它正在打印 1 和一些垃圾。

为什么cout 会这样?

【问题讨论】:

  • unsigned char 不是int。你为什么告诉printf它是?
  • 将二进制 1 发送到 stout 会有什么期望?
  • @chris unsigned char 将在 printf 调用中提升为 unsigned,因此该代码是可以接受的。
  • @john,啊,我真傻。我认为有一个 unsigned char 因为 char 之一,但这最终没有任何意义。感谢您清理它。
  • 前 32 个字符代码为控制代码,不可打印

标签: c++ printf


【解决方案1】:

您需要将a 类型转换为cout&lt;&lt; (int)(a); 的整数。有了这个,您将在输出中观察到1。使用cout &lt;&lt; a;,打印将是SOH (Start of Heading),对应于无法打印的1的ascii值,因此会观察到一些特殊字符。

编辑

更准确地说,cout 语句应该是 cout &lt;&lt; static_cast&lt;unsigned&gt;(a),正如 Nawaz 所提到的。

【讨论】:

    【解决方案2】:

    cout &lt;&lt; a 正在打印一个对您来说似乎是垃圾的值。其实不是垃圾。它只是一个 non-printable ASCII 字符,无论如何都会被打印出来。请注意,对应于 1 的 ASCII 字符是不可打印的。您可以检查a是否可打印,std::isprint为:

    std::cout << std::isprint(a) << std::endl;
    

    它将打印0(阅读:false),表示该字符不可打印

    --

    无论如何,如果您希望您的 cout 也打印 1,然后将 a 转换为:

    cout << static_cast<unsigned>(a) << std::endl;
    

    【讨论】:

    • 使用 cout 在 C++ 中打印签名字符怎么样?期望什么以及如何定义?例如:signed char a=-50; cout
    • 这行得通,但我想知道为什么?不应该是unsigned int 而不仅仅是unsigned 吗?因为unsigned 关键字可以与intfloat 或任何其他内置数据类型一起使用,对吧?
    • @Milan: unsigned 被编译器翻译成unsigned int
    • 我更喜欢一元加运算符而不是显式转换:std::cout &lt;&lt; +a &lt;&lt; '\n';
    【解决方案3】:

    printf("%u",a); 这么简单试试吧

    【讨论】:

    • 你能解释一下你的答案吗?
    • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit您的回答添加一些解释。特别是,请解释为什么您认为 %u%hhu 更好的 unsigned char 参数。
    • 这对解决这个问题根本没有任何作用(为什么cout::operator&lt;&lt;(unsigned char) 将其参数解释为字符而不是算术值?)
    【解决方案4】:

    我有一个类似的问题here,我早就忘记了。用iostream'scout解决这个问题可以这样:

    #include<iostream>
    #include<stdio.h>
    
    main() {
        unsigned char a;
        a=1;
        printf("%d", a);
        std::cout<< +a << std::endl;
    
        return 0;
    }
    

    如果您希望cout 打印unsigned char 值而不是ascii 字符,则不要将其转换回另一种类型。你需要promote它。

    如果你注意到我所做的只是在unsigned char 之前添加一个+。这是一元加法,它将提升unsigned char 为您提供实际的数字表示。

    用户 Baum mit Augen 负责提醒我这个解决方案。

    【讨论】:

    • 这很犀利:thumbup:
    【解决方案5】:

    C 编译器有自己的方式来定义打印输出的类型,因为您可以指定输出的类型。

    例如:

    uint8_t c = 100;
    printf("%d",c);
    

    因此您也可以将c 打印为int by %d、char %c、字符串%s 或十六进制值%x

    C++ 也有自己的方式,cout 默认将 8 位值打印为 char。因此,您必须在输出参数中使用说明符。

    您可以使用:

    1. 在输出参数名称之前的+

      uint8_t data_byte = 100;
      cout << "val: " << +data_byte << endl;
      
    2. 使用函数转换unsigned(var);喜欢,

       uint8_t data_byte = 100;
       cout << "val: " << unsigned(data_byte) << endl;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2014-02-04
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多