我对以下代码感到困惑:
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?
我犯了一些错误吗?
您所看到的是整数提升的结果。几乎所有对小于标准int类型的整数类型(例如char和short)的操作都对提升为该int类型的数据执行,并且这些操作的结果也是提升类型的。此提升规则包括一元运算~符。
从这个 C11 草案标准(我的粗体):
6.5.3.3 一元算术运算符
...
4 ~ 运算符的结果是其(提升的)操作数的按位补码(即,当且仅当转换后的操作数中的相应位未设置时,结果中的每一位都被设置)。对操作数执行整数提升, 结果具有提升的类型。如果提升的类型是无符号类型,则表达式 ~E 等效于该类型中可表示的最大值减去 E。
在您的系统上,(提升的)int类型的大小是 4 个字节。
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |