求无符号整数的补码

FInd Two's Complement for Unsigned Integer

我有一个简单的函数,可以找到一个无符号整数的补码,然后测试它以确保它是正确的

unsigned twoscomplement(unsigned v) {
};

int main()
{
    unsigned a = 255;
    unsigned c = twoscomplement(a);
    unsigned s = a+c;
    printf("%u+%u=%u\n", a, c, s);
    return 0;
} 

当我询问如何解决这个问题时,我得到了答案unsigned c = (~a)+1; 据我了解,(~a) 翻转位然后 +1 用于溢出?对此问题的任何帮助将不胜感激

每当我们使用一个补码或二进制补码时,我们都需要说明字的大小。如果字中有w位,那么一个数x的补码是减去x[=61得到的=]由w1组成的二进制数。如果w是16,我们用11111111111111112,就是65535,那么x的补码是 11111111111111112x。将 x 视为二进制数字(最多 w 位),无论 x 中的位是什么将在 11111111111111112x 中关闭,并且 x 中关闭的任何位都将在11111111111111112x。因此,所有的位都是互补的。

C有一个补码运算符; ~x 翻转所有位,因此它产生 x 的补码。

x的补码为2wx ,根据定义(除了0的补码为0)。 2w等于1加上那个由w1组成的二进制数。例如216 = 65535 + 1。因此,二的补码比一的补码多一。因此x的补码是~x + 1.

C 对于无符号整数也有一个二进制补码运算符。无符号算术被定义为“换行”模 2w;每当常规算术结果超出该范围时,根据需要通过添加或减去 2w 将其带回该范围。 x 的正则算术否定将为负(如果 x 不为零),因此 -x 的计算结果为 −x + 2w = 2wx,也就是二的补码x.