为什么我不能使用 ~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”。
我是这样写的:
#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”。