Binary 补码是分配的吗?

Binary 补码是分配的吗?,binary,Binary,我知道它是关联的和可交换的: 就是 (~x1 + ~x2) + ~x3 = ~x1 + (~x2 + ~x3) 及 但是,对于我尝试的案例,它似乎不是分布的,即 ~x1 + ~x2 != ~(x1 + x2) 这是真的吗?有证据吗 我的C代码如下: int n1 = 5; int n2 = 3; result = ~n1 + ~n2 == ~(n1 + n2); int calc = ~n1; int calc0 = ~n2; int calc1 = ~n1 + ~n2; i

我知道它是关联的和可交换的:

就是

(~x1 + ~x2) + ~x3 = ~x1 + (~x2 + ~x3) 

但是,对于我尝试的案例,它似乎不是分布的,即

~x1 + ~x2 != ~(x1 + x2)
这是真的吗?有证据吗

我的C代码如下:

int n1 = 5;
int n2 = 3;
result = ~n1 + ~n2 == ~(n1 + n2);

int calc = ~n1;  
int calc0 = ~n2;  
int calc1 = ~n1 + ~n2;  
int calc2 = ~(n1 + n2);

printf("(Part B: n1 is %d, n2 is %d\n", n1, n2);
printf("Part B: (calc is: %d and calc0 is: %d\n", calc, calc0); 
printf("Part B: (calc1 is: %d and calc2 is: %d\n", calc1, calc2);
printf("Part B: (~%d + ~%d) == ~(%d + %d) evaluates to %d\n", n1, n2, n1, n2, result); 
这将提供以下输出:

Part B: (n1 is 5, n2 is 3
Part B: (calc is: -6 and calc0 is: -4
Part B: (calc1 is: -10 and calc2 is: -9
Part B: (~5 + ~3) == ~(5 + 3) evaluates to 0
发件人:

发件人:


查看维基百科上的文章。补码中的加法具有末端进位,必须将溢出位添加到最低位

由于
~
(NOT)在“一”的补语中等于
-
(否定),我们可以将其改写为:

-x1 + -x2 = -(x1 + x2)

这是正确的。

请查看上的WikieDia文章。补码中的加法具有末端进位,必须将溢出位添加到最低位

由于
~
(NOT)在“一”的补语中等于
-
(否定),我们可以将其改写为:

-x1 + -x2 = -(x1 + x2)

这是正确的。

在固定宽度寄存器中,一个人的赞美词用于表示负数和正数。要在添加过程中分发,必须应用以下内容:
~a+~b
=
~(a+b)
。OP状态
+
表示添加“两个二进制数”。这本身是模糊的,但是如果我们认为它意味着添加无符号二进制数,那么不,一个人的赞美是不可分配的

请注意,在一个人的赞美语中有两个零:所有的位都是一或所有的位都是零

检查以查看
~0+~0!=~(0+0)
~0
为零。但是,
~0
由所有的表示。将其自身相加就是将其加倍(与左移位相同),从而在右手数字中引入零。但这不再是两个零中的一个

然而,
0
是零,
0+0
也是零,因此
~(0+0)
也是零。但是左边不是零,所以to分布不成立

另一方面。。。考虑两个恭维:翻转所有的位并加上一个。如果在一个人的恭维语中特别注意否定,那么“二元加法”的版本类似于两个人的恭维语,并且是分布的,因为你最终得到了一个熟悉的,就像两个人的恭维语一样


前面提到的关于处理加法的更多细节,以允许预期的算术行为。

一个人的称赞用于表示固定宽度寄存器中的负数和正数。要在添加过程中分发,必须应用以下内容:
~a+~b
=
~(a+b)
。OP状态
+
表示添加“两个二进制数”。这本身是模糊的,但是如果我们认为它意味着添加无符号二进制数,那么不,一个人的赞美是不可分配的

请注意,在一个人的赞美语中有两个零:所有的位都是一或所有的位都是零

检查以查看
~0+~0!=~(0+0)
~0
为零。但是,
~0
由所有的表示。将其自身相加就是将其加倍(与左移位相同),从而在右手数字中引入零。但这不再是两个零中的一个

然而,
0
是零,
0+0
也是零,因此
~(0+0)
也是零。但是左边不是零,所以to分布不成立

另一方面。。。考虑两个恭维:翻转所有的位并加上一个。如果在一个人的恭维语中特别注意否定,那么“二元加法”的版本类似于两个人的恭维语,并且是分布的,因为你最终得到了一个熟悉的,就像两个人的恭维语一样


前面提到的关于处理加法的更多细节,以允许预期的算术行为。

[我知道这真的很旧,但我有同样的问题,而且因为上面的答案相互矛盾…]

“一”的赞美确实是分配给加法的。代码中的问题(以及Kaganar的善意但不正确的回答)是,您正在丢弃进位——您可以用两个s的恭维,但不能用一个s的恭维

用于存储和的内容需要比求和内容更多的内存空间,这样就不会丢失进位。然后将进位折叠回用于存储操作数的位数,以获得正确的和。在一个人的恭维算术中,这被称为“端转进位”

来自维基百科的文章(“\u补充):

要将这个系统中表示的两个数字相加,一个进行常规的二进制加法,但随后需要进行一次端到端的进位:即,将任何结果进位加回到结果和中。要了解为什么这是必要的,请考虑下面的示例,说明添加的情况−1(11111110)至+2(00000010):

在前面的示例中,第一个二进制加法得到00000000,这是不正确的。正确的结果(00000001)仅在进位加回时出现

我对你的代码做了一点修改,使自己更容易做一个理智的检查和测试。使用有符号整数数据类型可能需要更多的考虑,或者考虑到端到端借用而不是携带。我没有走那么远,因为我的应用程序都是关于校验和的(即,无符号,仅限加法)


[我知道这真的很老了,但我有同样的问题,因为上面的答案是矛盾的…]

“一”的赞美确实是分配给加法的。代码中的问题(以及Kaganar的善意但不正确的回答)是,您正在丢弃进位——您可以用两个s的恭维,但不能用一个s的恭维

用于存储和的内容需要比求和内容更多的内存空间,这样就不会丢失进位。然后将进位折叠回用于存储操作数的位数,以获得正确的和。在一个人的恭维算术中,这被称为“端转进位”

来自维基百科的文章
-x1 + -x2 = -(x1 + x2)
      binary    decimal
    11111110     –1
 +  00000010     +2
 ───────────     ──
  1 00000000      0   ← Not the correct answer
           1     +1   ← Add carry
 ───────────     ──
    00000001      1   ← Correct answer
unsigned short n1 = 5;  //using 16-bit unsigned integers
unsigned short n2 = 3;

unsigned long oc_added = (unsigned short)~n1 + (unsigned short)~n2; //32bit
/*  Fold the carry bits into 16 bits */
while (oc_added >> 16)
    oc_added = (oc_added & 0xffff) + (oc_added >> 16);

unsigned long oc_sum = ~(n1 + n2);  //oc_sum has 32 bits (room for carry) 
/*  Fold the carry bits into 16 bits */
while (oc_sum >> 16)
    oc_sum = (oc_sum & 0xffff) + (oc_sum >> 16);

int result = oc_added == oc_sum;

unsigned short calc = ~n1;
unsigned short calc0 = ~n2;
unsigned short calc1 = ~n1 + ~n2;  //loses a carry bit
unsigned short calc2 = ~(n1 + n2);

printf("(Part B: n1 is %d, n2 is %d\n", n1, n2);
printf("Part B: (calc is: %d and calc0 is: %d\n", calc, calc0);
printf("Part B: (calc1 is: %d and calc2 is: %d\n", calc1, calc2);
printf("Part B: (~%d + ~%d) == ~(%d + %d) evaluates to %d\n", n1, n2, n1, n2, result);