这个程序的输出是-13。我从来没有完全理解 C 中的 ~ 运算符。为什么它给出 -13 作为输出?如何将 ~ 运算符限制为数字的 4 位?
#include<stdio.h>
#include<conio.h>
int main()
{
int a = 12;
a = ~a;
printf("%d",a);
getch();
return;
}
(12)10
二进制是(1100)2
波浪号是构成1100
-->的按位补码运算符0011
。但是,如果您在 32 位平台上工作,实际上我们得到的是:
0000 0000 0000 0000 0000 0000 0000 1100
其按位补码为:
1111 1111 1111 1111 1111 1111 1111 0011
|
现在,由于最左边的位是符号,所以数字变为负数。如果您使用 unsigned int ,您将能够更好地理解正在发生的事情:
unsigned int a = 12;
a = ~a;
会给:
1111 1111 1111 1111 1111 1111 1111 0011
哪个是4294967283
运算符~
是 C 中的逻辑运算符not
,即当应用于整数时,它会翻转其二进制表示的每一个 it。请注意,简单地定义整数 asint
使其成为无符号整数。这意味着第一个它被用作符号位。由于否定定义如-a = ~a + 1
您所见~a = -a - 1
。如果你只想翻转 a 的最后 4 位(或更一般地说是最后 k 位),int
你可以做这样的事情
int k = 4;
int mask = (1 << k) - 1;
int b = a ^ mask;
这是一个按位运算符(一个的补码)以这种方式工作:
~00000101 // 5
=11111010 // 250
所以 1 变成 0,反之亦然,但在某些情况下,符号位被激活,你会得到意想不到的结果
要将效果限制在指定的位数,只需使用按位掩码,例如:
#include <stdio.h>
int main(void) {
int a = 16; /* 10000 in binary */
int b = ~a; /* Will interpret b as -17 in two's complement */
int c = (a & ~0xF) | (~a & 0xF); /* Will limit operator to rightmost 4 bits,
so 00000 becomes 01111, and c will become
11111, not 11...101111, so c will be 31 */
printf("a is %d, b is %d, c is %d\n", a, b, c);
return 0;
}
输出:
paul@local:~/src/c/scratch$ ./comp
a is 16, b is -17, c is 31
paul@local:~/src/c/scratch$
~ 运算符充当二进制 NOT,即翻转数字中的所有位。有符号整数中的负数存储为二进制补码。