uint8不能';不能用cout打印 我在C++中使用整数的问题很奇怪。< /P>
我编写了一个简单的程序,将一个值设置为一个变量,然后打印它,但它没有按预期工作 我的程序只有两行代码:uint8不能';不能用cout打印 我在C++中使用整数的问题很奇怪。< /P>,c++,C++,我编写了一个简单的程序,将一个值设置为一个变量,然后打印它,但它没有按预期工作 我的程序只有两行代码: uint8_t aa = 5; cout << "value is " << aa << endl; 它实际上并不打印空白字符,但很可能是值为5的ASCII字符,该字符不可打印(或不可见)。有很多,其中大多数低于32,实际上是空白。< /P> 您必须将aa转换为unsigned int以输出数值,因为ostream&operatoruint8\u t很可
uint8_t aa = 5;
cout << "value is " << aa << endl;
它实际上并不打印空白字符,但很可能是值为5的ASCII字符,该字符不可打印(或不可见)。有很多,其中大多数低于32,实际上是空白。< /P>
您必须将
aa
转换为unsigned int
以输出数值,因为ostream&operatoruint8\u t
很可能是无符号字符的typedef
。ostream
类对无符号字符
有一个特殊重载,即它打印带有数字5的字符,数字5是不可打印的,因此是空白。这是因为输出操作符将uint8\t
视为字符
(uint8\u t
通常只是unsigned char
的别名),因此它使用ASCII码(这是最常见的字符编码系统)打印字符5
参见,例如,cout
将aa
视为ASCII值5
的char
,这是一个不可打印的字符,请在打印前尝试将其键入int
。使用(参数相关名称查找):
- 自定义流操纵器也是可能的
- 一元加号运算符也是一个简洁的习惯用法(
cout),正如其他人在出现问题之前所说的,因为标准流将有符号字符和无符号字符视为单个字符,而不是数字
以下是我的解决方案,代码更改最少:
uint8_t aa = 5;
cout << "value is " << aa + 0 << endl;
输出:
value is -120
bad value is 4294967176
value is 5
pepperάchico和πάντα给出的具有ADL的p.S.溶液ῥεῖ 非常漂亮。在任何基本数据类型的变量之前添加一元+运算符将给出可打印的数值,而不是ASCII字符(如果是字符类型)
uint8\u t aa=5;
既然C风格的强制转换是不受欢迎的,运算符,那么进行静态强制转换不是更好吗?它应该转换为int
。强制转换是实现这一点的一种方法,但不是唯一的方法。+aa
也起作用。int(var)和(int)var实际上不是一回事吗?请参阅使用type(var)的链接问题与(type)相同VaR与C Casic一样,用const等来尝试它,它删除它。“C类型的c++投给C++是出于很多原因。”“不是int(var)和(int)var实际上是同一件事吗?”“确实让你好像没意识到代码> int(var)< /c> >和<代码>(int)var < /Cord>具有完全相同的意思。(var)
在(int)var
完全相同的情况下是不被鼓励的,原因完全相同,因为它的意思完全相同。(不过,我可以理解你为什么要在这里使用它,所以我并不是说你需要使用static\u cast
。我只是觉得这里的注释线索有点不必要的混乱。)这不是一个有效的范例吗??@πάνταῥεῖ 当然,但别忘了:@πνταῥεῖ 好的,继续在C++代码中做大量的C风格的转换,那么,在他/她最适合的环境中,任何人都可以自由地工作。ῥεῖ 说真的吗?功能性样式转换也是c样式转换。改变一个样式转换对离开c领域没有任何帮助,请检查:。pete becker也对您的答案发表了评论,但您似乎错过了他的最后一条评论。此解决方案非常优雅有效,因为它与模板一起工作。事实上,这是唯一的解决方案解决方案我已经发现它对我有效。但是需要注意的是,第一个函数有一个bug,因为“os”绑定到一个类型,因此,有符号或无符号的值将被发送到错误的Operator版本。我希望标准真正将std::uint8_t作为一个单独的类型处理,而不仅仅是一个该死的typedefSon将字符语义应用到流对象中时。这些可能的副本很好,但是为什么C++不把代码> UIT88T < /代码>作为<代码>未签名的char <代码>,这是数值?@ r1s8k,这是因为,虽然<代码> uTn8}t < /C>只是一个类型的DEF,<代码>无符号char < /代码>,<代码>未签名。ed char
本身由ostream
处理,就像char
一样,并打印其ASCII值。@Harsh谢谢你!所以它是无符号char
的一种类型def,解释了很多。所以唯一的整数是int
,对吗?@R1S8K好吧,最小的整数类型应该是short int
,它占用2个字节e是整数类型的其他一些变体。@我还认为,在编程和声明变量时,如果我声明的变量只处理不超过250的小数字,并且具有大寄存器大小,如long
或int
,这并不重要,因为编译器会优化RAM或fla的使用SH根据登记的内容,我是对的吗?为什么C编译器把它当作一个数字。我认为C++在这点上是不同的。@ PerchEagle,如果你读了链接引用,你会看到操作符对于<代码>签名< /COD>和<代码>未签名< /Cord>字符都被重载。超出了普通的代码> char < /C> >,它在C++中实际上是一个第三个独立的类型),所以如果<代码> UIT88T 是<代码>未签名char < /> >的别名(很可能)这就是将要使用的。你能检查我在这个线程上的答案并告诉我我的答案是否正确吗?我的答案在最后一个之前。非常感谢。变量大小将从1字节增加到4字节。我想要一个1字节的变量。有什么帮助吗?变量大小将从1字节增加到4字节。我想要一个1字节的变量。有什么帮助吗?
*
42
uint8_t aa = 5;
cout << "value is " << aa + 0 << endl;
int8_t aa = -120;
cout << "value is " << aa + 0 << endl;
cout << "bad value is " << unsigned(aa) << endl;
value is -120
bad value is 4294967176
uint8_t aa = 5;
cout<<"value is "<< +aa <<endl; // value is 5
#include <iostream>
#include <cstddef>
int main()
{
uint8_t aa=5;
std::cout << "value is ";
std::cout.operator<<(aa);
std::cout << std::endl;
return 0;
}
value is 5