关于否定运算符对字节的行为

About the behavior of the negation operator with regard to bytes

为什么 - 运算符在处理字节时表现得像它一样?

例如:

#include <stdio.h>

#define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d"
#define BYTETOBINARY(byte)  \
  (byte & 0x80 ? 1 : 0), \
  (byte & 0x40 ? 1 : 0), \
  (byte & 0x20 ? 1 : 0), \
  (byte & 0x10 ? 1 : 0), \
  (byte & 0x08 ? 1 : 0), \
  (byte & 0x04 ? 1 : 0), \
  (byte & 0x02 ? 1 : 0), \
  (byte & 0x01 ? 1 : 0) 

int main()
{
char a =1;
printf (BYTETOBINARYPATTERN, BYTETOBINARY(a)); //00000001 
printf("\n");
printf("%d\n", a); //1    
a= ~a;
printf (BYTETOBINARYPATTERN, BYTETOBINARY(a)); //11111110   
printf("\n");
printf("%d\n", a); //-2    
a=-a;
printf (BYTETOBINARYPATTERN, BYTETOBINARY(a));//00000010  
printf("\n");
printf("%d\n", a);//2
}

为什么是00000010?是2的补码吗?但是如何以及为什么?

一元运算符 - 在有符号整数类型的正值和负值之间切换。在大多数机器上,这是用 2 的补码实现的。

2 的补码是通过首先翻转所有位,然后加 1 来完成的。因此取 11111110,翻转位产生 00000001,加 1 产生 00000010.

这与一元运算符 ~ 不同,后者是按位非运算符,它只是翻转所有位。