c - 检查输入是否是最大的 2 的补码整数
问题描述
/*
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
int isTmax (int x)
{
int t = x + 1;
return !(t + t) ^ !t;
}
如果x
是最大的 2 的补数,则2*t
溢出到 0,但如果x
是 -1,它也为 0,所以我们对其进行异或运算,!t
结果为 1。所以我们必须得到 1,但不知何故输出为 0。
解决方案
这段代码根本上是错误的。有符号溢出是未定义的行为,不能保证给出任何形式的确定性结果。
要检查一个数字是否是“最大可能的”,您宁愿将其与INT_MAX
limits.h 中的数字进行比较。或者,如果您愿意,请将其与(int) ((1u<<31)-1)
.
推荐阅读
- python - 对于虚拟 conda 环境,PyCharm 不工作,而 Jupyter notebook 工作
- reactjs - React useState 等待状态被设置
- php - PHP 文件下载:PHP 正在 ajax 响应中发送文件数据,但文件未下载
- javascript - 如何修复 _this.video 未定义
- gis - 从 NetLogo 中的栅格数据分配补丁值
- python-3.x - 有没有办法跟踪函数在 n 秒内被调用的次数?
- raspberry-pi - 未能加载提供程序 SiloedPackageProvider.dll 和 metaDeployProvider.dll
- julia - Julialang:在抽象类型上强制执行接口
- linux - 触发 IRQ 处理程序后如何写入文件?
- java - Cassandra 是否有可能返回不一致的值?