原码,补码,反码是计算机二进制中的存储方式。
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码:正数的反码还是等于原码
负数的反码就是他的原码除符号位外,按位取反。
补码:正数的补码等于他的原码
负数的补码等于反码+1。
在计算机当中是使用补码来存储的。
例如
整型(int) 为45 整型为4字节 32位
原码: 00000000 0010 0111
反码:1111 1111 1101 1000
补码:000 0000 0010 0111
整型(int)-45
原码:1000 0000 0010 0111
反码:1111 1111 1101 1000
补码:1111 1111 1101 1001
用Java语言实现 int 类型转换如下:
1 package ClassroomTest; 2 3 import java.util.Scanner; 4 5 public class Second { 6 7 8 9 @SuppressWarnings("resource") 10 public static void main(String[] args) { 11 int s[] =new int[32]; 12 int y[]=new int[32]; 13 int f[]=new int[32]; 14 int i=0; 15 int c; 16 Scanner sc=null; 17 System.out.println("请输入一个整数:"); 18 sc=new Scanner(System.in); 19 int a=sc.nextInt(); 20 if(a>=0) { //整数判断 21 while(a>=1) { //存入原码 22 c=a%2; 23 s[i]=c; 24 a=a/2; 25 i++; 26 } 27 int j; 28 j=31; 29 for(i=0;i<s.length;i++) { 30 y[j]=s[i]; 31 j--; 32 } 33 System.out.println(); 34 System.out.println("原码:"); //输出原码 35 for(i=0;i<y.length;i++) { //符号位为0 36 System.out.print(y[i]); 37 if((i+1)%4==0) { 38 System.out.print(" "); 39 } 40 } 41 System.out.println(); 42 System.out.println("反码:"); //输出反码 全部取反 43 for(i=(y.length-1);i>=0;i--) { 44 if(y[i]==0) { 45 f[i]=1; 46 }else { 47 f[i]=0; 48 } 49 } 50 for(i=0;i<f.length;i++) { 51 System.out.print(f[i]); 52 if((i+1)%4==0) { 53 System.out.print(" "); 54 } 55 } 56 System.out.println(); 57 System.out.println("补码:"); //输出补码 与原码相同 58 for(i=0;i<y.length;i++) { 59 System.out.print(y[i]); 60 if((i+1)%4==0) { 61 System.out.print(" "); 62 } 63 } 64 }else { //当输入整数为负数时 65 a=-a; 66 while(a>=1) { 67 c=a%2; 68 s[i]=c; 69 a=a/2; 70 i++; 71 } 72 int j; 73 j=31; 74 for(i=0;i<s.length;i++) { 75 y[j]=s[i]; 76 j--; 77 } 78 y[0]=1; 79 System.out.println(); 80 System.out.println("原码:"); //输出原码 81 for(i=0;i<y.length;i++) { //符号位为1 82 System.out.print(y[i]); 83 if((i+1)%4==0) { 84 System.out.print(" "); 85 } 86 } 87 System.out.println(); 88 System.out.println("反码:"); //输出反码 89 for(i=(y.length-1);i>=0;i--) { //符号位不变,其他数位取反 90 if(y[i]==0) { 91 f[i]=1; 92 }else { 93 f[i]=0; 94 } 95 } 96 f[0]=1; 97 for(i=0;i<f.length;i++) { 98 System.out.print(f[i]); 99 if((i+1)%4==0) { 100 System.out.print(" "); 101 } 102 } 103 System.out.println(); 104 System.out.println("补码:"); //输出补码 105 i=31; 106 f[31]=f[31]+1; 107 while(i>=0) { //转换为补码 在反码基础上+1 108 if(f[i]==2) { 109 f[i]=0; 110 f[i-1]=f[i-1]+1; 111 }else 112 { 113 f[i]=1; 114 } 115 i--; 116 } 117 118 for(i=0;i<f.length;i++) { 119 System.out.print(f[i]); 120 if((i+1)%4==0) { 121 System.out.print(" "); 122 } 123 } 124 125 } 126 127 } 128 }
运行结果如下:
请输入一个整数:
-32
原码:
1000 0000 0000 0000 0000 0000 0010 0000
反码:
1111 1111 1111 1111 1111 1111 1101 1111
补码:
1111 1111 1111 1111 1111 1111 1110 0000
请输入一个整数:
32
原码:
0000 0000 0000 0000 0000 0000 0010 0000
反码:
1111 1111 1111 1111 1111 1111 1101 1111
补码:
0000 0000 0000 0000 0000 0000 0010 0000
收获:
正整数的原码,反码,补码没有特殊地方,不需要特别记忆;但是对于负整数的原码要注意符号位为1,并且要转换为正整数之后再求二进制,对于反码,注意除去符号位之外的其他位数取反,反码在反码基础上加一(注意不要忘记按照二进制计算)。