unsigned char 1110(e)0101(5) 转成 char 的有关问题

unsigned char 1110(e)0101(5) 转成 char 的问题unsigned char 1110(e)0101(5) 转成 char1(当符号位)110(6

unsigned char 1110(e)0101(5) 转成 char 的问题
unsigned char 1110(e)0101(5) 转成 char  1(当符号位)110(6)0101(5) 怎么不是 65 而且俩个十六进制数就能表示一个char ,怎么可能多处6个f 多出来3字节呢

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char  s2 = 0xe5;
printf("%x\n",(char)s2); //ffffffe5 ???为什么会多处6个f?
return 0;
}

[解决办法]
1、强制类型转换并不会去改变数本身,所以不可能由e5变成65;
2、printf的%x会使得char提升到int类型,提升的时候会扩展符号位;
3、int是32位的,所以前面一共会扩展24个1位,这样是6个f。

引用:
unsigned char 1110(e)0101(5) 转成 char  1(当符号位)110(6)0101(5) 怎么不是 65 而且俩个十六进制数就能表示一个char ,怎么可能多处6个f 多出来3字节呢

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char  s2 = 0xe5;
printf("%x\n",(char)s2); //ffffffe5 ???为什么会多处6个f?
return 0;
}