printf char as c in hex

Rus*_*nas 4 c printf

我希望\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)

演示.

  • 还将转换说明符更改为 `%02hhx`。 (2认同)
  • `X` 使十六进制大写,如果有人需要的话。 (2认同)