我正在处理以下代码:
#include<iostream>
#include<stdio.h>
using namespace std;
main() {
unsigned char a;
a=1;
printf("%d", a);
cout<<a;
}
打印1和一些垃圾。
为什么cout
表现如此?
答案 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
。因此,您必须在输出参数中使用说明符。
您可以使用:
输出参数名称前的+
uint8_t data_byte = 100;
cout << "val: " << +data_byte << endl;
使用函数强制转换unsigned(var)
;喜欢,
uint8_t data_byte = 100;
cout << "val: " << unsigned(data_byte) << endl;
答案 4 :(得分:-2)
的printf( “%u” 的,A); 它如此简单,试试吧