java~二进制补码的用途

二进制补码(Binary Two's Complement)是一种表示有符号整数的方法,在计算机中广泛使用。它是通过对正数取反加一得到负数的表示方式。

在二进制补码表示中,一个固定位数的整数由固定数量的二进制位表示,其中最高位被用作符号位。对于N位的二进制补码表示,最高位(最左侧的位)为符号位,0表示正数,1表示负数。

正数的二进制补码表示与其二进制原码表示相同。例如,十进制数3的二进制补码表示为00000011

负数的二进制补码表示通过以下步骤获得:

  1. 将对应正数的二进制表示取反,即将0变为1,将1变为0。
  2. 对取反后的结果加1。

例如,十进制数-3的二进制补码表示为11111101。以下是对应步骤的说明:

  1. 正数3的二进制表示是00000011
  2. 取反得到11111100
  3. 加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得到的。