关于计算机负数的储存
计算机内部储存中,负数以其补码的形式存在,原因是在模意义下加上一个负数等价于加上一个mod-该数等价于数取反加一(所有操作均是为了避开减法)。
因此在32位二进制储存中最高位32位为符号位1000 0000 0000 0000 0000 0000 0000 0001表示最大的负数,0111 1111 1111 1111 1111 1111 1111 1111(2^32-1)表示为最大的整数。
并且一个数>>31为可以得到它的符号位;
例(绝对值函数)
int abs(int n)
{
return (n^(n>>31))-n>>31;
}
//“-”号等价于加上该数取其反码加1表示的数,故若n为负数n>>31的二进制表示为1111 1111 ......1111,-号运算后为0000.......0001等价于加1
//n^(n>>31)由上可知n右移31位后其二进制表示为1111 1111 .....1111,“1”与原数异或其实等价于求其反码
//因此当n为负数时该式子其实就是在逆向求其对应的原码,与求补码方式相同,即先求其反码再加一(其实就是“-”号运算)
//若为n为正数分析思路一样
//核心即是理解负数的储存形式为其补码,以及补码运算等价于 mod-码,例 8位 5可以表示为 0000 0101 模为1 0000 0000因此其负数储存为 1 0000 0000 - 0000 0101=1111 1111 - 0000 0101 +1即 1111 1011。
//而逆向求其原码亦是同理即原码=mod-补码 即补码的反码+1
参考链接:
https://blog.csdn.net/u014082714/article/details/43193173
https://oi-wiki.org/math/bit/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具