求无符号整数的补码
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的补码是 11111111111111112−x。将 x 视为二进制数字(最多 w 位),无论 x 中的位是什么将在 11111111111111112−x 中关闭,并且 x 中关闭的任何位都将在11111111111111112−x。因此,所有的位都是互补的。
C有一个补码运算符; ~x
翻转所有位,因此它产生 x
的补码。
x的补码为2w−x ,根据定义(除了0的补码为0)。 2w等于1加上那个由w1组成的二进制数。例如216 = 65535 + 1。因此,二的补码比一的补码多一。因此x
的补码是~x + 1
.
C 对于无符号整数也有一个二进制补码运算符。无符号算术被定义为“换行”模 2w;每当常规算术结果超出该范围时,根据需要通过添加或减去 2w 将其带回该范围。 x
的正则算术否定将为负(如果 x
不为零),因此 -x
的计算结果为 −x
+ 2w = 2w−x
,也就是二的补码x
.
我有一个简单的函数,可以找到一个无符号整数的补码,然后测试它以确保它是正确的
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的补码是 11111111111111112−x。将 x 视为二进制数字(最多 w 位),无论 x 中的位是什么将在 11111111111111112−x 中关闭,并且 x 中关闭的任何位都将在11111111111111112−x。因此,所有的位都是互补的。
C有一个补码运算符; ~x
翻转所有位,因此它产生 x
的补码。
x的补码为2w−x ,根据定义(除了0的补码为0)。 2w等于1加上那个由w1组成的二进制数。例如216 = 65535 + 1。因此,二的补码比一的补码多一。因此x
的补码是~x + 1
.
C 对于无符号整数也有一个二进制补码运算符。无符号算术被定义为“换行”模 2w;每当常规算术结果超出该范围时,根据需要通过添加或减去 2w 将其带回该范围。 x
的正则算术否定将为负(如果 x
不为零),因此 -x
的计算结果为 −x
+ 2w = 2w−x
,也就是二的补码x
.