预期的答案是222,但输出有所不同

时间:2018-12-18 20:31:27

标签: c

我使用以下初始化程序制作了一个程序

int j=35,l;
l=~j;

如果l打印为%d,则输出为-36

3 个答案:

答案 0 :(得分:4)

按位补码运算符~将其操作数的所有位取反。因此,假设int为32位,则二进制值为:

00000000 00000000 00000000 00100011

在应用~之后成为这个:

11111111 11111111 11111111 11011100

假设负数以二进制补码表示,则该值为-36。

您期望的值222类似于int的二进制形式:

00000000 00000000 00000000 11011110

因此,您似乎希望只有最低有效字节会被反转,而所有字节中的位都会被反转。

答案 1 :(得分:2)

也许您的意思是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;
}

打印位置:

~35 (signed) = -36
~35 (unsigned) = 220

请记住,int通常为32位或更多,而不是您期望的8位。

答案 2 :(得分:1)

220是无符号值,表示使用8位数据类型存储时的否定值35。

C标准保证

int至少为 16位,因此您将绝不通过否定{{1 }}包含35。使用int中的uint8_t存储35的值及其取反。

还请注意,<stdint.h>系列函数将printf%u的参数分别提升为%dunsigned int的参数,因此您可能希望将较高的在打印时按位与。