25

我正在处理以下代码:

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

using namespace std;

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

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

为什么cout会有这样的行为?

4

5 回答 5

41

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

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

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

--

无论如何,如果您还想cout打印1,请转换a为:

cout << static_cast<unsigned>(a) << std::endl;
于 2013-03-23T09:42:51.517 回答
11

我在这里有一个类似的问题,我早就忘记了。可以这样解决这个问题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 负责提醒我这个解决方案。

于 2017-12-29T15:22:09.810 回答
3

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

编辑

更准确地说,该cout声明应cout << static_cast<unsigned>(a)如纳瓦兹所说。

于 2013-03-23T09:41:42.077 回答
3

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

前任:

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

因此您也可以打印c为 int by %d、char %c、string%s或 hex 值%x

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

您可以使用:

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

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

     uint8_t data_byte = 100;
     cout << "val: " << unsigned(data_byte) << endl;
    
于 2019-05-25T21:51:30.003 回答
-3

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

于 2016-05-18T05:27:30.423 回答