快速计算补码表示的值

本文介绍了如何快速计算补码表示的数值,通过补码直接计算正负值,分析了不同范围内的补码转换规则,并提供了多个实例进行详细解释,帮助理解补码在计算机中表示负数和处理溢出的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

  • 掌握二进制与十进制的转换。
  • 掌握原码、反码、补码。
  • Java 的整数型 byte 的取值范围。

目的

无需将补码转成原码,再计算原码表示的值:

  • 快速计算补码表示的值。
  • 两个同类型的值相加后,若溢出,值为?

公理 1

w 位二进制数,此二进制数能够表示的最大值:2w - 1。如 0b11111111 = 28 - 1 = 255。

推导 1

以 8 位为例,设 0b111110 = x。

-x 的原码:1 1111110
-x 的反码:1 0000001
-x 的补码:1 0000010

反码是除了符号位,对原码求反,0b1111111 - 0b1111110 = 0b0000001。不考虑符号位,得到的二进制数值为:(27 - 1) - x = 127 - x。

补码是反码+1,值为:128 - x。如果再加上符号位 1,当成原码看待,值为:-(128 - x) = -128 + x。

-x 的补码是 -128 + x 的原码。

结论 1

设 x < 0,则 x 的补码是 -2w-1 - x 的原码。

例 1:w = 8,计算补码 1 0000011 对应的值。

看符号位为 1,是负数的补码。

  • 设此值为 x,x 的补码 1 0000011 是 -128 - x 的原码 1 0000011

  • -3 的原码 1 0000011

  • 推出:-128 - x = -3。

  • 得到:x = -128 + 3 = -125。

    -3 移到左边变为正数,x = -128 + 0b00000011 = -125。

验证:

补码:1 0000011
反码:1 0000010
原码:1 1111101

0b1111101 = 125,再加上符号位,值为 -125

例 2:w = 8,计算补码 1 1010001 对应的值。

值 = -128 + 0b01010001 = -128 + 81 = -47。

推导 2

补码 1 1010001 = -128 + 0b1010001。

二进制数 1 1010001 = 0b10000000 + 0b1010001 = 128 + 0b1010001。

二进制数 = 补码 + 256。

结论 2

x < 0,则 x 的补码被当成二进制数后,值为 x + 2w

例 3:w = 8,值为 -32 的补码被当作二进制数时,值为?

值 = -32 + 256 = 224。

-32 的原码:1 0100000
-32 的补码:1 1100000
0b11100000 = 224

例 4:w = 8,求 -21 的补码。

-21 + 256 = 235,-21 的补码为 235 的二进制 11101011。

公理 2

w 位二进制数作为补码,取值范围:[-2w-1,2w-1 - 1],超出此范围,溢出,无法精确表示值。

推导 3

w = 8 时,正数范围:[1,127],即 00000001 ~ 01111111。

当计算结果 x 处于 [128,255] 时,最高位为 1,被当作补码的符号位。

  • 最高位不表示值,减去 0b10000000(128)。
  • 由例 2 得知,计算补码还得减去 128。
  • 所以 x 的二进制被当作补码后,值为 x - 256。

如 129 的 10000001 被当作补码后,值为 -127。

  • 129 = 0b10000000 + 0b00000001,减去 128,得到 0b00000001。
  • 补码 10000001 对应的值:-128 + 0b00000001 = -127。

结论 3

当 x 处于 [2w-1,2w - 1] 范围内,被当作补码后,值为 x - 2w

例 5:

byte b = 127;
b += 3;
System.out.println(b);// -126

b = 130 - 28 = 130 - 256 = -126。

推导 4

当计算结果 x 处于 [-255,-129] 时,最高位为 0,被当作正数的补码。

-128 + -1 =

   10000000
+  11111111
= 101111111

想要完整表示此补码,w 需等于 9,由例 2 得,补码 101111111 对应的值为:-28 + 0b01111111 = -256 + 127 = -129。

现在只留 8 位,剩下 0b01111111 = -129 + 28 = 127。

结论 4

当 x 处于 [-2w + 1,-2w-1 - 1] 范围内,被当作补码后,值为 x + 2w

例 6:

byte b = -128;
b -= 23;
System.out.println(b);// 105

-151 + 256 = 105。

待证明

x > 0,设 m = x % 2w

  • 若 m ∈ [0,2w-1 - 1],则值为 m。

  • 若 m ∈ [2w-1,2w - 1],则值为 m - 2w

// 1294 % 256 = 14
System.out.println((byte)1294);// 14
// 640 % 256 = 128,128 - 256 = -128
System.out.println((byte)640);// -128
// 1023 % 256 = 255,255 - 256 = -1
System.out.println((byte)1023);// -1
System.out.println((byte)1024);// 0

x < 0,设 m = x % 2w

  • 若 m = 0,则值为 0。

  • 若 m ∈ [-2w-1,-1],则值为 m。

  • 若 m ∈ [-2w + 1,-2w-1 - 1],则值为 m + 2w

// -532 % 256 = -20
System.out.println((byte)-532);// -20
// -400 % 256 = -144,-144 + 256 = 112
System.out.println((byte)-400);// 112
// -512 % 256 = 0
System.out.println((byte)-512);// 0
// -1234 % 256 = -210,-210 + 256 = 46
System.out.println((byte)-1234);// 46
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值