补码反码

存储一字节(8位)大小的数字 (char类型)

原码(用户角度):原始的二进制
  1. 用户的数字分为正负数, 符号位的存储
  2. 最高位为符号位: 0 代表为正数,1代表为负数
  3. 1000 00001 左边是高位,右边是低位
1,  +1
0000 0001  :  第一位代表为 + 

	 -1	  
1000 0001  :  第一位代表为 - 
原码存储导致 2 个问题:
  1. 0 有2种存储方式
  2. 正数和负数相加结果不正确 (计算机只会相加不会相减)
1 - 1 = 1 + -1

 1: 0000 0001
-1: 1000 0001 + 
----------------
	 1000 0010    = -2
反码(为了算补码):
  1. 正数的原码和反码是一样的
  2. 求原码
  3. 在原码基础上,符号位不变,其他位取反(0 为 1 , 1 变 0)
以 反码的形式来算  
 1: 0000 0001
-1: 1111 1110 +
----------------
	 1111 1111  = -0
反码存储导致1种问题:
  1. 0 有两种存储方式

计算机存储数字以补码方式存储(主要是为了解决负数的存储)

补码:
  1. 正数的原码和反码是一样的
  2. 补位为其 反码 +1
负数补码 + 1就变成了
 1: 0000 0001
-1: 1111 1111 +
----------------
   1 0000 0000  = (最高位丢弃) = 0000 0000 

因为存储一个字节需要 8 位,但是这样就变成了 9 位。所以丢弃第一位。

十进制数,站在用户的角度。原码
二进制、八进制、十六进制 站在计算角度,补码

原码求补码过程:

1)最高位符号位,其他位就是二进制位(原码)
2)在 1) 的基础上,符号位不变,其他位置取反。 (反码)
3)补码在2) 的基础上, +1 (补码)

补码求原码

1) 补码
2) 求补码的反码,符号位不变,其他位置取反
3) 原码 在 2) 的基础上 +1

// 0x81 转为二进制位 1000 0001,最高位为 1 , 说明是负数
char a = 0x81
补码: 1000 0001
反码: 1111 1110
原码: 1111 1111 = -127

// 打印十进制数,站在用户的角度,原码
print("%d\n",a); // -127

%x 默认以4个字节(32位) 大小打印

只有负数才会有反码补码,正数的反码和补码都是其本身。切记

你可能感兴趣的:(反码,补码,计算机)