cout不打印unsigned char

Hit*_*ani 16 c++ printf

我正在编写以下代码:

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

using namespace std;

main() {
    unsigned char a;
    a=1;
    printf("%d", a);
    cout<<a;
}
Run Code Online (Sandbox Code Playgroud)

它打印1和一些垃圾.

为什么cout表现如此?

Naw*_*waz 31

cout << a正在打印一个看似垃圾的值.实际上它不是垃圾.它只是一个不可打印的 ASCII字符,无论如何都要打印出来.请注意,对应的ASCII字符1是不可打印的.您可以检查是否a可打印,std::isprint如下所示:

std::cout << std::isprint(a) << std::endl;
Run Code Online (Sandbox Code Playgroud)

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

-

无论如何,如果你想要你cout也打印1,那么转换a为:

cout << static_cast<unsigned>(a) << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • @Milan:“unsigned”被编译器翻译为“unsigned int”。 (2认同)

Fra*_*ler 7

我在这里有一个我早已忘记的类似问题。解决此问题的方法iostream's cout可以这样完成:

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

main() {
    unsigned char a;
    a=1;
    printf("%d", a);
    std::cout<< +a << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果要cout打印unsigned charascii字符相对的值,而不是将其强制转换回另一种类型。您需要promote它。

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

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


Gan*_*esh 5

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

编辑

更准确地说,这个cout说法应该是cout << static_cast<unsigned>(a)纳瓦兹所说的那样。