#include <stdio.h>
#include <limits.h>
main()
{
signed char i = ~0;
printf("%zu\n", i);
return 0;
}
但是结果是4294967295
而不是-1
。为什么会这样?
signed char
值时,它将自动转换为int
。然后,当使用格式说明符int
(用于格式化无符号%zu
的格式)打印有符号的size_t
时,由于不匹配,您将得到错误的结果。使用signed char
正确打印%hhd
。
[另外,您应该理解,虽然signed char
值-1可以用8位11111111(以8位二进制补码表示)表示,但是当它转换为int
时,结果是32位11111111111111111111111111111111 (使用32位二进制补码表示-1)。当这些位被解释为32位无符号整数时,结果为4294967295。这解释了为什么可以打印“ 4294967295”而不是将八位11111111解释为无符号整数所产生的“ 255”的原因。
当在表达式中使用signed char
值时,它将自动转换为int
。然后,当使用格式说明符int
(用于格式化无符号%zu
的格式)打印有符号的size_t
时,由于不匹配,您将得到错误的结果。
使用signed char
正确打印%hhd
。
[另外,您应该理解,虽然signed char
值-1可以用8位11111111(以8位二进制补码表示)表示,但是当它转换为int
时,结果是32位11111111111111111111111111111111 (使用32位二进制补码表示-1)。当这些位被解释为32位无符号整数时,结果为4294967295。这解释了为什么可以打印“ 4294967295”而不是将八位11111111解释为无符号整数所产生的“ 255”的原因。