查找无符号整数的补码
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的补码就是11111111111111112−x。将 x 视为二进制数字(最多有 w 位),在 x 中打开的任何位都将在 1111111111111112 中关闭-x,而在 x 中关闭的任何位都将在 11111111111111112-x 中打开.因此,所有位都被补码。
C 有一个补码运算符; ~x
翻转所有位,因此它产生 x
的反码。
x 的补码是 2w−x,根据定义(除了0 是 0)。 2w 等于由 w 1 组成的二进制数字加一。例如,216 = 65535 + 1。因此,二的补码比一的补码多一。因此x
的二进制补码是~x + 1
。
C 还有一个用于二进制补码的运算符,用于无符号整数。无符号算术被定义为“包装”模 2w;每当常规算术结果超出该范围时,通过根据需要添加或减去 2w 将其带回该范围。 x
的常规算术否定将是负数(如果 x
不为零),所以 -x
的计算结果是 -x
+ 2w = 2w−x
,是x
的补码。
【讨论】:
以上是关于查找无符号整数的补码的主要内容,如果未能解决你的问题,请参考以下文章