我希望\9b\d9\c0...从下面的代码输出一些东西,但我得到了\ffffff9b\ffffffd9\ffffffc0\ffffff9d\53\ffffffa9\fffffff4\49\ffffffb0\ffff
ffef\ffffffd9\ffffffaa\61\fffffff7\54\fffffffb.我向char添加了显式转换,但它没有效果.这里发生了什么?
typdef struct PT {
// ... omitted
char GUID[16];
} PT;
PT *pt;
// ... omitted
int i;
for(i=0;i<16;i++) {
printf("\\%02x", (char) pt->GUID[i]);
}
Run Code Online (Sandbox Code Playgroud)
编辑:只(unsigned char)为我工作.使用%02hhx(gcc -Wall)时编译器会向我发出警告.(unsigned int)没有效果.
das*_*ght 10
发生这种情况的原因是char系统上的s已签名.当你将它们传递给具有可变数量参数的函数时,例如printf(在签名的固定参数部分之外)chars被转换为int,并且它们在进程中得到符号扩展.
要解决此问题,请将值强制转换为unsigned char:
printf("\\%02hhx", (unsigned char) pt->GUID[i]);
Run Code Online (Sandbox Code Playgroud)