栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

快速计算补码表示的值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速计算补码表示的值

前提

  • 掌握二进制与十进制的转换。
  • 掌握原码、反码、补码。
  • 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035410.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号