原码 补码 反码

Posted hellsino

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原码 补码 反码相关的知识,希望对你有一定的参考价值。

一.原码

正数的原码就是它的本身

假设使用一个字节存储整数,整数10的原码是:0000 1010

负数用最高位是1表示负数

假设使用一个字节存储整数,整数-10的原码是:1000 1010

 

二.反码

正数的反码跟原码一样

假设使用一个字节存储整数,整数10的反码是:0000 1010

负数的反码是负数的原码按位取反(0变1,1变0),符号位不变

假设使用一个字节存储整数,整数-10的反码是:1111 0101

 

三.补码(再次强调,整数的补码才是在计算机中的存储形式。)

正数的补码和原码一样

假设使用一个字节存储整数,整数10的补码是:0000 1010(强调:这是整数10在计算机中存储形式)

负数的补码是负数的反码加1

假设使用一个字节存储整数,整数-10的补码是:1111 0110(强调:这是整数-10在计算机中存储形式)

 

四.在计算机中,为什么不用原码和反码,而是用补码呢?

因为在使用原码,反码在计算时不准确,使用补码计算时才准确。

 

使用原码计算10-10

    0000 1010(10的原码)

  +  1000 1010(-10的原码)

------------------------------------------------------------

    1001 0100(结果为:-20,很显然按照原码计算答案是错误的。)

 

使用反码计算10-10

    0000 1010(10的反码)

  +  1111 0101(-10的反码)

------------------------------------------------------------
    1111 1111  (计算的结果为反码,我们转换为原码的结果为:1000 0000,最终的结果为:-0,很显然按照反码计算答案也是错误的。)

 

使用补码计算10-10

    0000 1010(10的补码)

  +  1111 0110 (-10的补码)

------------------------------------------------------------
    1 0000 0000 (由于我们这里使用了的1个字节存储,因此只能存储8位,最高位(第九位)那个1没有地方存,就被丢弃了。因此,结果为:0)

 

Java的负数采用补码方式存储,那么"8"+"-8"等于多少呢?

 

技术分享图片
如上图所示:数字"8"和"-8"的相加的和为:"100000000",很显然,一个字节只能存储8位,所以,我们要把最前面的那个"1"丢弃掉,这样就得到了"00000000",即8个"0",因此,"8"+"-8"的值为"0"。现在想想发明二进制算法的人真是牛逼啊!连这样的空隙都想出来了!!

 

练习

DEC:十进制

BIN:二进制整数以0b或0B开头;

OCT:八进制以0开头;

HEX:十六进制以0x或0X开头,其中10~15分别以a~f或A~F来表示。

 

技术分享图片

 

 //定义两个8进制的二进制整数

int binValue1 = 0b00001010;

int binValue1 = 0B00001010;

int binValue3 = 0B10000000000000000000000000001010;

System.out.println("binValue1");//输出10

System.out.println("binValue2");//输出10

System.out.println("binValue3");//输出-10

当定义32位的二进制整数时(1个字节占8位),最高位其实是符号位;当符号位是1时,表明它是一个负数,负数在计算机里以补码的形式存在。
所有数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数。但计算机以补码的形式保存所有的整数。补码的计算规则:正数的补码和原码完全相同,负数的补码是其反码加1;反码是对原码按位取反,只是最高位(符号位)保持不变。





以上是关于原码 补码 反码的主要内容,如果未能解决你的问题,请参考以下文章

一个数的原码,反码,补码怎么算

原码反码补码

原码反码补码

知道 补码,如何 计算 原码

二进制的原码、补码、反码详解

原码反码补码与位运算