为什么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的补充吗?但是如何以及为什么?
答案 0 :(得分:3)
一元-
运算符在有符号整数类型中切换正值和负值。在大多数机器上,这是用2的补码实现的。
2的补码是通过首先翻转所有位,然后加1来完成的。因此,取11111110
,翻转位会产生00000001
,并且加1会产生00000010
。
这与一元~
运算符不同,后者是bitwise-NOT运算符,它只是翻转所有位。