cout不打印unsigned char

时间:2013-03-23 09:38:40

标签: c++ printf

我正在处理以下代码:

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

using namespace std;

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

打印1和一些垃圾。

为什么cout表现如此?

5 个答案:

答案 0 :(得分:30)

cout << a正在打印一个看似垃圾的值。实际上它不是垃圾。它只是一个不可打印的 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;

答案 1 :(得分:5)

我有一个类似的问题here,我早已忘记了。 iostream's cout解决此问题的方法可以这样做:

#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负责提醒我这个解决方案。

答案 2 :(得分:3)

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

修改

为了更准确,cout声明应该是cout << static_cast<unsigned>(a),正如纳瓦兹所提到的那样。

答案 3 :(得分:0)

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

例如:

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

因此,您还可以将c打印为整数,%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;
    

答案 4 :(得分:-2)

的printf( “%u” 的,A); 它如此简单,试试吧