Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
uint8不能';不能用cout打印 我在C++中使用整数的问题很奇怪。< /P>_C++ - Fatal编程技术网

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&operator
uint8\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