查找无符号整数的补码

Posted

技术标签:

【中文标题】查找无符号整数的补码【英文标题】:FInd Two's Complement for Unsigned Integer 【发布时间】:2021-11-23 22:14:23 【问题描述】:

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

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 用于溢出?对此问题的任何帮助将不胜感激

【问题讨论】:

为了得到一个补码,我们从一个补码开始(即)我们通过执行~a来反转位。有了这个,为了得到两个的补码,我们给它加一个。那是基本的定义/操作。它是否溢出对于该机械操作来说并不是真正的问题。 可能是一个 signed 数字的问题,以及我们之后如何处理它,但它不是一个 unsigned 数字 请大家帮忙 【参考方案1】:

每当我们使用一个补码或二进制补码时,我们都需要说明字长是多少。如果字中有w位,则x的补码是由组成的二进制数减去x得到的。 em>w 1s。如果w是16,我们用11111111111111112,也就是65535。那么x的补码就是11111111111111112x。将 x 视为二进制数字(最多有 w 位),在 x 中打开的任何位都将在 1111111111111112 中关闭-x,而在 x 中关闭的任何位都将在 11111111111111112-x 中打开.因此,所有位都被补码。

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

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

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

【讨论】:

以上是关于查找无符号整数的补码的主要内容,如果未能解决你的问题,请参考以下文章

Java负整数的左移右移无符号右移

深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)

整数编码

使用 32 位无符号整数乘以 64 位数字的算法

在无符号 32 位整数中查找位位置

原码 反码 补码