java~二进制补码的用途
二进制补码(Binary Two's Complement)是一种表示有符号整数的方法,在计算机中广泛使用。它是通过对正数取反加一得到负数的表示方式。
在二进制补码表示中,一个固定位数的整数由固定数量的二进制位表示,其中最高位被用作符号位。对于N位的二进制补码表示,最高位(最左侧的位)为符号位,0表示正数,1表示负数。
正数的二进制补码表示与其二进制原码表示相同。例如,十进制数3的二进制补码表示为00000011
。
负数的二进制补码表示通过以下步骤获得:
- 将对应正数的二进制表示取反,即将0变为1,将1变为0。
- 对取反后的结果加1。
例如,十进制数-3的二进制补码表示为11111101
。以下是对应步骤的说明:
- 正数3的二进制表示是
00000011
。 - 取反得到
11111100
。 - 加1得到
11111101
,即-3的二进制补码表示。
使用二进制补码的好处是可以将正数和负数的加法、减法等运算转化为相同的二进制操作,简化了计算机的运算逻辑。
需要注意的是,二进制补码表示中的最小负数的绝对值比最大正数的绝对值多一个单位,这是由于二进制补码表示中,负数的范围比正数的范围多一个。例如,在8位的二进制补码表示中,最小的负数是-128,而最大的正数是127。
容易搞混
- java里byte是有符号的整数,它占用的存储空间为1个字节,即8位,使用8个二进制数表示,也可以用2个16进制数表示,取值为-128~127
- java里没有无符号的byte[],如果你非要表示无符号的,那需要使用short/int类型来表示,就是使用integer的8位,通过
int unsignedByte = byteValue & 0xFF;
可以得到无符号的byte值
byte[]来表示int数字
通过byte[4]来表示一个int数字,byte[4]就是4个字节的意思,每个byte[0]表示一个字段,取值都是-128~127,可以测试一下
log.info("{}", Bytes.toBytes(256));// [0, 0, 1, 0]
log.info("{}", Bytes.toBytes(255));// [0, 0, 0, -1]
log.info("{}", Bytes.toBytes(128));// [0, 0, 0, -128]
log.info("{}", Bytes.toBytes(129));// [0, 0, 0, -127]
log.info("{}", Bytes.toBytes(-1));// [-1, -1, -1, -1]
log.info("{}", Bytes.toBytes(127));// [0, 0, 0, 127]
从上面的代码中,我们看到一个int类型的-1通过byte[]表示为[-1,-1,-1,-1],它是取-1的补码,再加1得到的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2018-06-20 springcloud~配置中心实例搭建
2018-06-20 springcloud~Eureka实例搭建
2017-06-20 docker~Dockerfile优化程序的部署
2016-06-20 插件~使用ECharts动态在地图上标识点
2013-06-20 EF架构~引入规约(Specification)模式,让程序扩展性更强
2012-06-20 面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用