为什么 `(char)~0` 和 `(unsigned char)~0` 返回不同宽度的值?

Mar*_*son 4 c char integer-promotion unsigned-integer signed-integer

我在编写一个程序试图打印 UTF-8 字符的组成字节值时遇到了这个问题。

这是我为测试各种操作而编写的程序~0

#include <stdio.h>

int main()
{
    printf("%x\n", (char)~0); // ffffffff
    printf("%x\n", (unsigned char)~0); // ff
    printf("%d\n", sizeof(char) == sizeof(unsigned char)); // 1
    printf("%d\n", sizeof(char) == sizeof(unsigned int)); // 0
    printf("%d\n", (char)~0 == (unsigned int)~0); // 1
}
Run Code Online (Sandbox Code Playgroud)

我正在努力理解为什么当char产生int- 大小的值时会unsigned char产生 -char大小的值。

dbu*_*ush 8

当将小于的类型传递int给诸如 之类的可变参数函数时printf,它会被提升为type int

在第一种情况下,您传递char的值为 -1,其表示形式(假设 2 的补码)为 0xff。它被提升为int值为 -1 且表示为 0xffffffff,因此这就是打印的内容。

在第二种情况下,您传递的unsigned char值为 255,其表示形式为 0xff。它被提升为int值 255 和表示形式 0x000000ff,因此这就是打印的内容(没有前导零)。