源码、反码、补码的学习
在Java的学习过程中,我们总会遇到一个问题:在做数值计算时,总会出现打印出的结果与预期的计算结果的值有或多或少的偏差的情况。为了理解出现这个问题的原因,我利用课余时间进行了对源码、补码、反码的学习。
首先,在最开始,先说一说这三个具体是个什么东西吧。
源码,据我理解就是它是用二进制的方式表现一个十进制的数,并且这一串二进制的首位为符号为,0代表这个数是正数、1代表这个数是负数。但是呢,光用源码处理负数时就会出现一些问题,导致实际结果与目标结果相反。为了解决这个问题,于是出现了反码。反码的计算规则则是正数反码与源码相同,而负数的反码是在源码基础上符号位不变,其它位数0变1、1变0。虽然反码解决了负数计算的问题,但是呢因为0和负0源码不同,导致他们虽然是同一个数,但是反码不同,可能会影响计算,就比如-1+2按照反码计算的结果为0,原因就是因为零和负零占了两个反码。为了解决这个问题,计算机学者们又做出了补码,整数的补码与反码相同,负数的补码为反码加一。至此,计算机内大部分数值的计算都是通过补码的形势实现了。
通过对源码补码的学习,让我串联起了不少知识之间的关系。就比如不同的定义类型为什么会根据数值的范围大小不同而存储空间不同。因为二进制的一位零或者一表示一个比特,八个比特为一个字节,所以随着数字数值的变大,记录二进制数字的位数必然也会提高,所以数字所占的内存也会变大。而int型为什么占了4个字节,也就是三十二个比特位,但是它的范围只包括二的负三十一次方到正的三十一次方,为什么不是三十二次方呢?这个问题,也因为知道了计算机存储数据的第一位为符号位迎刃而解。至于为什么高阶转低阶的强制转换为什么会使数字往奇怪的方向发生变化,这也就好解释了,毕竟低阶位的变量类型没有足够的比特位去记录高阶位的数字,还有就是计算机存储的是二进制数字跟咱们日常生活中惯用的十进制还是有很大区别的,经过这么两次修改,强制转换后的数字不变得奇奇怪怪就怪了。
以上,便是我对于源码、补码、反码的一些学习记录。计算机科学技术方面的知识真实深奥的同时又具备着有趣,期待以后可以学习并掌握更多的知识。而为了更好地学习这些知识,我就需要直面自己的问题,所以在未来的学习生活中,我要尽可能做到在面对错误时不急躁、遇到困难不能先被搓了自己的锐气、更重要的是戒掉懒癌。
对于下一步的学习计划,我希望大二这一年可以独立完成一个可以正常游玩的小体量游戏,这就需要我通过自己的努力在学习学校课程的同时去自学一些内容了。所以说,加油吧!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!