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

时间:2015-09-15 18:18:50

标签: c bit-manipulation operators byte

为什么b运算符的行为与处理字节时的行为相同?

例如:

-

为什么#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 } ?这是2的补充吗?但是如何以及为什么?

1 个答案:

答案 0 :(得分:3)

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

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

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