为什么字符上的“~”运算符会产生更多字节?

iwa*_*rer 4 c

我对以下代码感到困惑:

char c = 0x66;
printf("~c = %x\n", ~c); //0xffffff99
printf("size of c: %d\n", sizeof(c)); //1 byte
printf("Size of ~c: %d\n", sizeof(~c)); //4 bytes
Run Code Online (Sandbox Code Playgroud)

Achar只有 1 个字节,但使用~运算符的结果将是 4 个字节。为什么是~c 0xffffff99而不是的结果0x99

我犯了一些错误吗?

Adr*_*ica 6

您所看到的是整数提升的结果。几乎所有对小于标准int类型的整数类型(例如charshort)的操作都对提升为该int类型的数据执行,并且这些操作的结果也是提升类型的。此提升规则包括一元运算~符。

这个 C11 草案标准(我的粗体):

6.5.3.3 一元算术运算符

...
4 ~ 运算符的结果是其(提升的)操作数的按位补码(即,当且仅当转换后的操作数中的相应位未设置时,结果中的每一位都被设置)。对操作数执行整数提升, 结果具有提升的类型。如果提升的类型是无符号类型,则表达式 ~E 等效于该类型中可表示的最大值减去 E。

在您的系统上,(提升的)int类型的大小是 4 个字节。