2015-09-28 31 views
2
int main() { 
    char k = 0xd8; 
    cout << hex << k << endl; 
} 

出于某种原因,打印出的字符格式为k而不是十六进制形式d8。做cout << hex << (int) k << endl;给我ffffd8这不是我想要的。字符为十六进制,字节大小相同C++

+0

它看起来像你的意思了'k'有型'无符号char'; 'char'可能会被签名,因此不能保证能够存储一个大到0xd8的数字。 – Hurkyl

回答

3

这只是C++的许多缺陷之一,也是我坚持使用C的另一个原因。您可以在下面提供的参考文献中阅读有关该主题的更多信息。为了节省一些麻烦,考虑在生产代码中使用printf()系列函数,因为修复不能保证符合标准。

代码


#include <iostream> 
using namespace std; 

int main(void) 
{ 
    unsigned char k = 0xd8; 
    cout << "k = 0x" << hex << +k << endl; 
} 

样本输出


k = 0xd8 

参考


  1. 代码批判:堆栈溢出海报不能打印字符的数值,http://cpp.indi.frih.net/blog/2014/08/code-critique-stack-overflow-posters-cant-print-the-numeric-value-of-a-char/明确的C++,访问的2015年9月27日
  2. 披肩:用于字符打印的数值(和(U)中int8_t),http://cpp.indi.frih.net/blog/2014/09/tippet-printing-numeric-values-for-chars-and-uint8_t/明确的C++,访问的2015年9月27日
+3

另外:'+ k'本质上只是写'(int)k'的一种深奥的方式。 (或者'(unsigned int)k';我不记得那个细节) – Hurkyl

+0

另外,你认为这是不是符合标准?在C++中使用'printf'有很好的理由,但这不是其中之一。 –

+0

http://stackoverflow.com/a/25701418/103167 –