C 预期答案是222,但输出不同
我已经用下面的初始化程序C 预期答案是222,但输出不同,c,C,我已经用下面的初始化程序 int j=35,l; l=~j; 如果l打印为%d,则输出为-36按位互补运算符~反转其操作数的所有位。因此,假设int为32位,则二进制值: 00000000 00000000 00000000 00100011 应用~后变为: 11111111 11111111 11111111 11011100 假设负数用2的补码表示,则该值为-36 您期望的值222在二进制中看起来像是int: 00000000 00000000 00000000 11011110 因
int j=35,l;
l=~j;
如果
l
打印为%d
,则输出为-36按位互补运算符~
反转其操作数的所有位。因此,假设int
为32位,则二进制值:
00000000 00000000 00000000 00100011
应用~
后变为:
11111111 11111111 11111111 11011100
假设负数用2的补码表示,则该值为-36
您期望的值222在二进制中看起来像是int
:
00000000 00000000 00000000 11011110
因此,您似乎期望只有最低有效字节被反转,但所有字节中的位都被反转。也许您的意思是220,如本例所示:
#include <stdio.h>
int main() {
char s = 35;
unsigned char u = 35;
char is = ~s;
unsigned char iu = ~u;
printf("~35 (signed) = %d\n", is);
printf("~35 (unsigned) = %d\n", iu);
return 0;
}
请记住,
int
通常是32位或更多,而不是您所期望的8位。220是无符号值,当与8位数据类型一起存储时,表示35的求反
int
由C标准保证至少为16位,因此您永远不会通过对包含35位的int
求反来产生220的值。使用
中的uint8\u t
存储35的值及其求反
还要注意的是,
printf
-系列函数分别将%u
和%d
参数提升到无符号int
和int
,因此您可能希望在打印时按位和切掉较高的位。请解释一下为什么您希望输出为222?让我们看看你的逻辑。35的二进制是00100001,它的补码是11011110,其十进制等价物是222。如果上述解释是错误的,那么请引导我找到正确答案。35的二进制是00100011请注意还有一个一位错误:11011100
vs11011110
@zwol正确。它与OP虽然是35.Right的二进制表示形式相反。OP犯了两个错误,但你的回答听起来好像只有一个。这就是我要说的。字符的警告都取决于它是否有符号,对于gcc/g++,字符是无符号的,在这两种情况下都产生220。使用signed char
使-36int
实际上由C标准保证至少为16位
~35 (signed) = -36
~35 (unsigned) = 220