代码回顾:关于写代码时cout 和printf 输出16进制数的简单思考

来源:互联网 发布:经典句子 知乎 编辑:程序博客网 时间:2024/06/16 19:23

好吧,我承认自己很low,为这些东西烦恼,不过自认为基础一直是很重要的,尤其是对我这样的。。。

1、今天在用cout 输出 unsigned char 形式的数据时,控制台显示的是乱码,改用printf 的形式输出,解决了这个问题,这在C/C++中比较容易混淆。

unsigned char i=0xaa;char j=1;cout<<i;           //输出乱码cout<<j;           //输出乱码
cout<<(int)i;      //可以printf(“%x”,i) //可以

      现在总结如下:

      unsigned char的类型归根结底还是整型,关键要看它是以字符形式还是整型打印出来。

      对象操作符<<对char整型做了处理,如果是字符形式的就直接输出,如果不是字符类型,就按照整型的格式输出,j=1时,以ASCII格式存储,但是不能 打印,所以是乱码,            可以用强制转换类型实现输出,所以条件许可的话,最好还是利用printf函数实现按格式输出。减少歧义。


2.另外一种情况

char i=0xf0;printf("%X",i);//输出fffffff0
这种情况是由于程序在识别符号的时候造成的,通常一般将i设置为unsigned char的格式。

按照网友的说法,挺好的,我不再修改了:

0xf0(char) 压入函数参数栈 是不是就变成了 0xfffffff0(int) ?
假如你还不能理解,可以这么想:
b[1] = 0xf0; 也就是 b[1] = -16;
int param = b[1]; 此时 param 是不是应该等于 -16 ?
int类型的-16是不是就是 0xfffffff0 ?
按照C语言标准,你应该将 %02x 改为 %02hhx,也就是加两个 h
但假如你用的是比较垃圾的VC,那就只能用 printf("b[1] is %02x\n",(unsigned char)b[1]); 了

0 0