# 原码、反码、补码

**URL:** <https://www.shiqidu.com/t/topic/338>\
**Category:** 开发调优\
**Tags:** C-C-Obj-C\
**Created:** [2017 年12 月 10 日 05:29 UTC](https://www.shiqidu.com/t/topic/338 "2017-12-10T05:29:20Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![Eureka](https://www.shiqidu.com/user_avatar/www.shiqidu.com/eureka/32/5_2.png) [@Eureka](https://www.shiqidu.com/u/Eureka)\
发布日期： [2017 年12 月 10 日 05:29 UTC](https://www.shiqidu.com/t/topic/338/1 "2017-12-10T05:29:20Z")

</div>

## 原码反码补码基本概念

- 数据在计算机内部是以补码的形式储存的

- 数据分为有符号数和无符号数

- 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要 使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.  
原码, 反码, 补码是计算机原理的术语。说白了就是为了理解计算机2进制用的。对于C/C++来 说,是和数据类型有关的。

- 原码

```auto
原码:[+1]0000 0001  
原码:[-1]1000 0001  

```

- 反码
  - 正数的反码是其本身
  - 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

```auto
原码:[+1]0000 0001 反码:0000 0001  
原码:[-1]1000 0001 反码:1111 1110  

```

```
&gt;+ 可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计 算.  

```

- 补码
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

```auto
原码:[+1]0000 0001 反码:0000 0001 补码:0000 0001  
原码:[-1]1000 0001 反码:1111 1110 补码:1111 1111  

```

```
&gt;+ 对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.  

```

* * *

## -1在内存中存储细节

- 在64为计算机中,-1的原码、反码、补码如下

```auto
-1原码 1000 0000 0000 0000 0000 0000 0000 0001  
-1反码 1111 1111 1111 1111 1111 1111 1111 1110  
-1补码 1111 1111 1111 1111 1111 1111 1111 1111  

```

## \>+ 正整数取反+1就是对应负数
