首页 > 解决方案 > Bitwise arthmetric 这个结果是真还是假

问题描述

给定三个变量:

int x = rand();
int y = rand(); 
int z = x + y;

z + (~x + 1)等于总是真的吗y?或者是否存在可能导致结果不等于的溢出y

标签: c

解决方案


在带环绕的二进制补码有符号算术中,(~x + 1)等于-x,所以z + (~x + 1)等于z - x等于y,无论 和 的原始值是x什么y

C 实现可能不使用带回绕的二进制补码有符号算术有两个可能的原因。

  1. 原则上,C 标准仍然提供了 CPU 不使用二进制补码表示负数的可能性。这在今天不太可能是相关的:UNIVAC是我所知道的唯一一个仍在生产中的例子,实际上我很惊讶地发现它仍在生产中。

  2. C 标准说有符号溢出具有未定义的行为。这意味着允许编译器假设它永远不会发生,并生成代码,如果任一加法溢出,将产生任意无意义的输出(甚至崩溃)。这可能是相关的

x您可以通过声明,yzto beunsigned int来避免这两种可能性int。然后y + x + (~x + 1)保证等于y


推荐阅读