0

这个程序的输出是-13。我从来没有完全理解 C 中的 ~ 运算符。为什么它给出 -13 作为输出?如何将 ~ 运算符限制为数字的 4 位?

    #include<stdio.h>
    #include<conio.h>
    int main()
    {
        int a = 12;
        a = ~a;
        printf("%d",a);
        getch();
        return;
    } 
4

5 回答 5

1

(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

于 2013-10-20T15:13:14.177 回答
1

运算符~是 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;
于 2013-10-20T15:14:30.773 回答
1

这是一个按位运算符(一个的补码)以这种方式工作:

~00000101 // 5
=11111010 // 250

所以 1 变成 0,反之亦然,但在某些情况下,符号位被激活,你会得到意想不到的结果

于 2013-10-20T15:02:58.060 回答
1

要将效果限制在指定的位数,只需使用按位掩码,例如:

#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$
于 2013-10-20T15:10:15.730 回答
0

~ 运算符充当二进制 NOT,即翻转数字中的所有位。有符号整数中的负数存储为二进制补码

于 2013-10-20T15:10:40.700 回答