我正在编写以下代码:
#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)
我在这里有一个我早已忘记的类似问题。解决此问题的方法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 char与ascii字符相对的值,而不是将其强制转换回另一种类型。您需要promote它。
如果您注意到我所做的只是在+之前添加unsigned char。这是一元加法,它将促进unsigned char为您提供实际的数字表示形式。
用户Baum mit Augen负责提醒我该解决方案。
您需要将其类型转换a为整数cout<< (int)(a);。这样您将观察1输出。使用 时cout << a;,打印将对应于无法打印的SOH (Start of Heading)ascii 值,因此会观察到一些特殊字符。1
编辑:
更准确地说,这个cout说法应该是cout << static_cast<unsigned>(a)纳瓦兹所说的那样。