为什么我不能使用 ~0 来初始化 signed char?

Why can't I use ~0 to initialize signed char?

我是这样写的:

#include <stdio.h>
#include <limits.h>

main()
{
    signed char i = ~0;
    printf("%zu\n", i);
    return 0;
}

但结果是 4294967295 而不是 -1。为什么会这样?

您正在使用 %zu 打印 i 值。在无符号格式中 -1=2^32-1 等于 4294967295。编译器使用公式 2^(sizeof type in bits)-n 将有符号值转换为无符号值。

当您在表达式中使用 signed char 值时,它会自动转换为 int。然后,当您使用用于格式化无符号 size_t 的格式说明符 %zu 打印带符号的 int 时,由于不匹配,您会得到错误的结果。

要正确打印 signed char,请使用 %hhd

此外,您应该明白,虽然 signed char 值 −1 ​​可能用八位 11111111(八位二进制补码)表示,但当它转换为 int 时,结果是 32 位 11111111111111111111111111111111(使用 32 位二进制补码表示 −1)。当这些位被解释为 32 位无符号整数时,结果为 4294967295。这解释了为什么可能打印“4294967295”而不是将八位 11111111 解释为无符号整数所产生的“255”。