c - Bitwise arthmetric 这个结果是真还是假
问题描述
给定三个变量:
int x = rand();
int y = rand();
int z = x + y;
z + (~x + 1)
等于总是真的吗y
?或者是否存在可能导致结果不等于的溢出y
?
解决方案
在带环绕的二进制补码有符号算术中,(~x + 1)
等于-x
,所以z + (~x + 1)
等于z - x
等于y
,无论 和 的原始值是x
什么y
。
C 实现可能不使用带回绕的二进制补码有符号算术有两个可能的原因。
原则上,C 标准仍然提供了 CPU 不使用二进制补码表示负数的可能性。这在今天不太可能是相关的:UNIVAC是我所知道的唯一一个仍在生产中的例子,实际上我很惊讶地发现它仍在生产中。
C 标准说有符号溢出具有未定义的行为。这意味着允许编译器假设它永远不会发生,并生成代码,如果任一加法溢出,将产生任意无意义的输出(甚至崩溃)。这可能是相关的。
x
您可以通过声明,y
和z
to beunsigned int
来避免这两种可能性int
。然后y + x + (~x + 1)
保证等于y
。
推荐阅读
- ios - CFRunLoop 正在调用 Source0 执行函数崩溃
- python - OpenCV 霍夫线与 scikit-image
- javascript - 运行量角器测试时出错 - Java 问题?
- sql-server - Azure SQL Server 中数据仓库之间的交叉引用
- python - 如何在 Python 中压缩重要的重复代码
- ios - 如何在 iOS Chart Graph Framework 中设置多种背景颜色
- node.js - 为什么没有安装barcodescanner?在离子
- react-admin - 如何在 react-admin 的列表视图中的“创建”按钮上预填充复杂嵌套表单的结构?
- javascript - 自定义钩子等待来自 useEffect 钩子的回调
- wikipedia - 从 wikidata rdf 文件中提取三元组