0xb9用"%x"输入结果是ffffffb9吗?
#include <iostream>
using namespace std;
main()
{
char a[3] = {(char)0xb9, (char)0xe2, 0x00};
printf( "%s\n ", a);
printf( "%x\n ", a[1]);//结果:ffffffb9,但是我认为是b9,为什么多了ffffff
system( "pause ");
}
[解决办法]
问题出在x是针对整形数据的,如果给出的参数不是整形,那么首先提升
因为很多系统里(包括你用的编译器),char是带符号的,那么提升为整数时也就考虑了符号
那么字符b9如果按照有符号解释的话,就等于-71,如果按照四个字节补码表示的话
就是ffffffb9,
另外你的程序实际上是打印的a[1],你本意是要写a[0]的!!!!
做如下修正就可以了
printf( "%x\n ", (unsigned char)a[0]);//结果:ffffffb9,但是我认为是b9,为什么多了ffffff
原因在于明确表明这个字符无符号以后,到整形的转换就不会出现负数
[解决办法]
PS:如果你直接写printf( "%x ", 0xb9)的话,你得到的就是你想要的b9
因为常数0xb9就是一个整数,且不是负整数
在转化为十六进制的时候,经常碰到符号问题,你可以多加注意
另外“整形提升”是一个比较重要的概念
[解决办法]
因为 %x 输出的是一个 整型的数据,
不是一个char 类型的 ~
[解决办法]
printf( "%x\n ", a[1]);
==》
printf( "%x\n ", a[1]&0xff); //屏蔽高位
[解决办法]
嗯,楼上的已经说得很好了
再给你一个链接
http://blog.csdn.net/fengzi_zhu/archive/2003/03/31/14337.aspx