原码 补码 反码
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;反码是对原码按位取反,只是最高位(符号位)保持不变。
以上是关于原码 补码 反码的主要内容,如果未能解决你的问题,请参考以下文章