c语言 - 无符号整数的第二个补码



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

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的补码为111111111111111111112x。将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= 2wx,即x的二补。

最新更新