1.练习题 2.31
练习题 2.31
补码溢出的判断
int tadd_ok(int a;int b)
{
int neg_over = a>0 && b>0 && a+b<0;
int pos_over = a<0 && b<0 && a+b>0;
return !neg_over &&pos_over;
}
你的同事对你补码加法溢出条件的分析有些不耐烦了,他给出了一个 函数 tadd_ok 的实现,如下所示:
/* Determine whether arguments can be added without overflow */
/* WARNING: This code is buggy. */
int tadd_ok(int x, int y)
{
int sum= x+y;
return (sum-x == y) && (sum-y == x);
}
这段代码是错误的:
当相加不溢出时, (sum-x == y) 和 (sum-y == x) 都是成立的
当正溢出时
sum = x + y -2^w
sum-x = x +y -2^w -x = (y - 2^w) mod 2^w = y
当负溢出时
sum = x + y + 2^w
sum -x = x + y + 2^w -x = (y + 2^w) mod 2^w = y
所以,无论正溢出还是负溢出,sum -x = y 是一定的
所以,这不可作为判断溢出的条件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?