为什么10的按位补码是-11

use*_*000 3 c

为什么~10的结果是-11?不应该是5,因为〜操作翻转每一点.

10 = 1010

~10 = 0101 // 5十进制

#include<stdio.h>

int main()
{

    unsigned int b =10;
    b= ~b;
    printf("bitwise %d\n ",b);     
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

us2*_*012 14

这有很多不妥之处.

  1. 你是否取消了unsigned int,然后将其打印为signed int(%d用于有符号整数).将结果打印为unsigned int,您将意识到......

  2. 在32位int机器上,10(十进制)不是1010(二进制)但是000000000000000000000000000001010.

  3. 最后,将所有内容转换回有符号整数,并了解两个补码表示法,以了解负数如何存储在您的计算机中.


Ser*_*lis 7

不要忘记你正在翻转一位,包括最重要的位(有符号变量的符号位).将变量定义为无符号不会更改二进制表示,只会更改程序使用它的方式.

因此,当您将数字打印为signed(%d)时,您将获得-11.

 10 = 0x0000000A (10)
~10 = 0xFFFFFFF5 (-11 signed / 4294967285 unsigned)
Run Code Online (Sandbox Code Playgroud)

要打印为未签名使用:

printf("bitwise %u\n ",b); 
Run Code Online (Sandbox Code Playgroud)