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

C 为什么10的位补码是-11,c,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; } #包括 int main() { 无符号整数b=10; b=~b; printf(“按位%d\n”,b); 返回0; } 这有

为什么~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;
}
#包括
int main()
{
无符号整数b=10;
b=~b;
printf(“按位%d\n”,b);
返回0;
}

这有很多问题

  • 对无符号整数进行位求反,然后将其打印为有符号整数(
    %d
    表示有符号整数)。将结果打印为无符号整数,您将实现

  • 在32位的
    int
    机器上,
    10
    (十进制)不是
    1010
    (二进制),而是
    000000000000000000000001010

  • 最后,将所有内容转换回有符号整数,学习2的补码表示法,以了解负数是如何存储在计算机中的


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

    因此,当您将数字打印为已签名(
    %d
    )时,您将得到-11

     10 = 0x0000000A (10)
    ~10 = 0xFFFFFFF5 (-11 signed / 4294967285 unsigned)
    
    要以未签名方式打印,请使用:

    printf("bitwise %u\n ",b); 
    

    -另外,
    int
    s应该有32位。也可能是重复的,这不是固定宽度整数的工作方式。给自己准备一本基本的数学和硬件书籍。给定一个8位整数,你翻转所有的位,包括前导零。换句话说,10实际上是00001010,而不仅仅是1010。翻转它们,得到11110101,即-11,如果使用无符号整数,则为245。如果它是一个4位整数,是的,你会得到5。顺便说一下,
    %d
    表示有符号十进制整数。您需要
    %u
    ,因为您的整数是无符号的。无符号值不需要,但如果您将它们用作有符号值,则它们会<代码>无符号vs
    有符号
    不会更改二进制表示形式。还有,我打错了,谢谢你的更正。你仍然不能将其称为无符号整数的“符号位”,它是参与变量值的最高有效位,被printf用错误的错误打印格式解释为符号位。@Étienne,我明白了,你和Andrey是正确的,我会修改我的答案,这样就不会产生误导。对不起,误会了。@Serdalis:不太好。只有当实际值在
    int
    的正范围内时,才允许使用
    %d
    修饰符向
    printf
    提供一个
    无符号
    值(该语言保证表示匹配)。在所有其他情况下,这只是未定义的行为。在一般情况下,在
    printf
    中说
    %d
    将“使用无符号值作为有符号值”是不正确的。