为什么不能使用〜0来初始化带符号的字符? [关闭]

问题描述 投票:0回答:2
我这样写:

#include <stdio.h> #include <limits.h> main() { signed char i = ~0; printf("%zu\n", i); return 0; }

但是结果是4294967295而不是-1。为什么会这样?
c ansi-c
2个回答
2
投票
当在表达式中使用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”的原因。


0
投票
您正在使用%zu打印i值。以未识别格式-1 = 2 ^ 32-1等于4294967295.编译器使用公式2 ^(sizeoftype,以位为单位)-n将带符号的值转换为无符号。

0
投票

当在表达式中使用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”的原因。

© www.soinside.com 2019 - 2024. All rights reserved.