Java基础(3)原码、反码、补码转换

本文介绍了计算机中数字的二进制表示法,特别是原码、反码和补码的概念。详细解释了二进制最高位作为符号位,以及正数、负数和0在三种码制下的特性。强调Java中所有数字都是有符号的,并且在计算过程中使用补码。最后总结了原码、反码和补码之间的转换步骤。

一、什么是原码

        原码:是一种计算机中对数字的二进制定点表示方法,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小

二、二进制(也就是原码)

        二进制由0和1组成

        二进制分为:

         8位(0000 0000)

        16位(0000 0000 0000 0000)

        32位(0000 0000 0000 0000 0000 0000 0000 0000)

        64位(0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000)

举例理解:

        0 对应的8位二进制数 = 0000 0000

        1 对应的8位二进制数 = 0000 0001

        5(4+1) 对应的8位二进制数 = 0000 0101

        7(4+2+1)对应的8位二进制数 = 0000 0111

        那么就可以理解为:0的原码是0000 0000  , 7的原码是 0000 0111

三、了解原码、反码、补码之间的转换

        1、二进制最高位(最左边)是符号位:0表示正数,1表示负数

        举例理解:

                1 的 8位二进制数为:0000 0001

                -1 的 8位二进制数为:1000 0001

        2、正数的原码、反码、补码都一样(正数三码合一)

        3、负数的反码=原码符号位不变,其他位取反(0->1,1->0)

        举例理解:

                      要计算一个数的反码要先知道原码

                      ①负数的原码

                       -1的原码是:1000 0001

                      ②负数的反码(原码符号位也就是最高位(最左边)不变,其他位取反)

                       -1的反码是:1111 1110

                 例2:

                        -8的原码是:1000 1000

                        -8的反码是:1111  0111

        4、负数的补码=反码+1

         举例理解:

                        计算一个负数的补码要先知道负数的反码(计算负数的反码要先知道负数的原码)

                        ①:负数的原码

                         -1的原码是:1000 0001

                        ②:负数的反码

                         -1的反码是:1111 1110

                        ③:负数的补码(反码+1)

                         -1的补码是:1111 1111

                  例2:

                        -7的原码是:1000 0111

                        -7的反码是:1111 1000

                        -7的补码是:1111 1001

        5、负数的反码=负数的补码-1

                        知道一个负数的补码可以倒推出来反码和原码

                        ①:负数的补码

                        -11的补码是:1111 0101

                        ②:负数的反码(补码-1)

                        -11的反码是:1111 0100

                        ③:负数的原码(原码符号位不变,其他位取反0->1,1->0)

                        -11的原码是:1000 1011

                   例2:

                        -32的补码是:11100000(64+32=96)

                        -32的反码是:11011111 (96-1=95)(95=64+16+8+4+2+1)

                        -32的原码是:10100000

        6、0的反码、补码都是0

        7、Java中没有无符号数(Java中的数都是有符号的)

        8、在计算机运算中,都是以补码的方式来运算的

        9、当我们看运算结果时,要看原码

四、原码、反码、补码之间的转换步骤总结

        原码=>反码=>补码

        补码=>反码=>原码

### 原码反码补码转换规则 #### 1. **原码反码之间的转换** - 对于正数,其原码反码相同。 - 对于负数,反码可以通过将原码中的符号位保持不变,其他位按位取反来获得。 示例: - 数值 `-5` 的原码为 `10000101`(假设字长为8位),则其反码为 `11111010`[^3]。 --- #### 2. **原码补码之间的转换** - 对于正数,其原码补码相同。 - 对于负数,补码可通过先求得该数的反码,然后在其基础上加 1 来获取。 示例: - 继续以上述 `-5` 为例,已知其反码为 `11111010`,那么它的补码为 `11111011`[^1]。 --- #### 3. **反码补码之间的转换** - 对于正数,其反码补码相同。 - 对于负数,补码等于反码加 1;反之,通过将补码减去 1 即可恢复成反码。 示例: - 已知某负数的补码为 `11111011`,将其减去 1 后得到反码 `11111010`[^2]。 --- #### C语言实现代码 以下是基于上述理论编写的用于完成各种编码之间相互转换的功能函数: ```c #include <stdio.h> // 将原码转为补码 int toTwosComplement(int num) { if (num >= 0) { return num; // 正数原码补码相同 } return (~(-num) + 1); // 负数原码补码 } // 将补码还原为原码 int fromTwosComplement(int num) { if ((num & 0x8000) == 0) { return num; // 补码为正数时不变 } return -(~(num - 1)); // 补码为负数时转原码 } // 反码补码 int onesToTwosComplement(int num) { if ((num & 0x8000) == 0) { return num; // 正数反码补码相同 } return num + 1; // 负数反码补码 } // 补码反码 int twosToOnesComplement(int num) { if ((num & 0x8000) == 0) { return num; // 正数补码反码相同 } return num - 1; // 负数补码反码 } ``` --- ### 总结 通过对不同编码形式的理解及其相互关系的学习可知,采用补码表示法能够有效解决传统原码在执行加减运算过程中遇到的一些特殊问题,比如存在两个零的情况以及无法正确处理某些边界条件等问题。因此,在现代计算机体系结构设计中广泛采用了这种机制以提高数据处理效率并减少错误发生几率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值