关于计算机负数的储存

计算机内部储存中,负数以其补码的形式存在,原因是在模意义下加上一个负数等价于加上一个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/

posted @   亽乂  阅读(263)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示