我有一个简单的函数,它将找到一个无符号整数的两个补码,然后测试它以确保它是正确的
unsigned twoscomplement(unsigned v) {
};
int main()
{
unsigned a = 255;
unsigned c = twoscomplement(a);
unsigned s = a+c;
printf("%u+%u=%un", a, c, s);
return 0;
}
当我问我将如何解决这个问题时,我得到了答案unsigned c = (~a)+1;
从我所理解的(~a)
翻转位,然后+1
是溢出?在这件事上任何帮助都将是感激的。
当我们使用1的补码或2的补码时,我们需要说明字长是多少。如果字中有w位,则在由w1组成的二进制数中减去x得到x的一补。如果w等于16,则使用1111111111111111112,即65535。则x的补码为111111111111111111112−x。将x视为二进制数(最多有w位),在x中打开的位将在1111111111111111111111111111111111111111111111111111111111111111111111111111111111112x中打开。因此,所有的位都是互补的。
C有1的补数运算符;~x
翻转所有位,因此它产生x
的1的补码。
x的双补是2w-x,根据定义(除了0的双补是0)2w等于1加上由w1组成的二进制数。例如:216= 65535 + 1。因此,二的补数比一的补数多一。因此,x
的二补是~x + 1
。
C也有一个运算符,用于两个的补数,用于无符号整数。无符号算术被定义为" wrap "模2w;每当常规算术结果超出该范围时,根据需要通过添加或减去2w将其带回到该范围。x
的正则算术负数为负(如果x
不为零),因此-x
的计算结果为−x
+ 2w= 2w−x
,即x
的二补。