Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 预期答案是222,但输出不同_C - Fatal编程技术网

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
vs
11011110
@zwol正确。它与OP虽然是35.Right的二进制表示形式相反。OP犯了两个错误,但你的回答听起来好像只有一个。这就是我要说的。字符的警告都取决于它是否有符号,对于gcc/g++,字符是无符号的,在这两种情况下都产生220。使用
signed char
使-36
int
实际上由C标准保证至少为16位
~35 (signed) = -36
~35 (unsigned) = 220