关于否定运算符对字节的行为
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
.
这与一元运算符 ~
不同,后者是按位非运算符,它只是翻转所有位。
为什么 -
运算符在处理字节时表现得像它一样?
例如:
#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
.
这与一元运算符 ~
不同,后者是按位非运算符,它只是翻转所有位。