我有一个关于在c++中处理整数的奇怪问题。
我写了一个简单的程序,将一个值设置为一个变量,然后打印它,但它不像预期的那样工作。
我的程序只有两行代码:
uint8_t aa = 5;
cout << "value is " << aa << endl;
这个程序的输出是value is
也就是说,它为aa打印空白。
当我把uint8_t改为uint16_t时,上面的代码就像一个魅力。
我使用Ubuntu 12.04 (Precise Pangolin), 64位,我的编译器版本是:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
正如其他人之前所说,问题发生是因为标准流将signed char和unsigned char视为单个字符,而不是数字。
以下是我对代码修改最少的解决方案:
uint8_t aa = 5;
cout << "value is " << aa + 0 << endl;
添加“+0”对包括浮点数在内的任何数字都是安全的。
对于整型,如果sizeof(aa) < sizeof(int),则将结果类型更改为int。如果sizeof(aa) >= sizeof(int),它不会改变类型。
这个解决方案也适用于准备将int8_t打印到流中,而其他一些解决方案则不太好:
int8_t aa = -120;
cout << "value is " << aa + 0 << endl;
cout << "bad value is " << unsigned(aa) << endl;
输出:
value is -120
bad value is 4294967176
P.S.由pepper_chico和π α νταῥεῖ给出的带有ADL的解真的很漂亮。