原码

计算机中所有的数字都是使用 01 这样的二进制数来进行表示的。

这时如果要存储一个数据,比如十进制的 3,那么就需要使用 2 个二进制位来保存,二进制格式为 11,占用两个位置,称为 2 bit 位。

一般占用 8 个 bit 位表示一个字节(B)2 个字节等于 1 个字,所以一个字表示 16 个 bit 位

数字的直接二进制表示称为原码

虽然原码表示简单,但是原码在做加减法的时候,就会出现问题。

以 8 bit 位为例:

  1 + (-1)
取原码:
0000 0001
+
1000 0001
=
0000 1010
取十进制:
-2

显然结果应该为 0-2 的结果是错误的。

为了解决这一问题,引入了反码

反码

正数的反码是其本身。

负数的反码是其原码符号位不变,其余各位取反。

经过上面的定义,再来进行加减法:

  1 + (-1)
原码:
0000 0001
+
1000 0001
反码:
0000 0001
+
1111 1110
=
1111 1111
逆反码(取反):
1000 0000
十进制:
-0

这样虽然结果看起来对了。

但如果 1111 1111 代表 -00000 0000 代表 +0

+0-0 都等于 0

一个 0 用两个二进制数表示,既浪费也不合理,所以又引入了补码

补码

正数的补码就是其本身

负数的补码是其原码符号位不变,其余各位取反(得到反码),最后 + 1

再来看上面的运算:

  1 + (-1)
原码:
0000 0001
+
1000 0001
反码:
0000 0001
+
1111 1110
补码:
0000 0001
+
1111 1111
=
1 0000 0000
省略高位:
0000 0000
逆补码(本身):
0000 0000
逆反码(本身):
0000 0000
十进制:
0

这样就得到了预期的 0

可以看出,补码是计算机数字存储和运算的完美解决方案,所以计算机中的数字都是以补码存储

C 语言使用的也是补码。

取值范围

按照上面原码的定义,可以根据位数推出取值范围。

比如现在一共有 8 bit 位来保存数据,为了表示正负,可以让第一个 bit 位专门来保存符号,这样能够表示的数据范围就是:

  • 最小:1111 1111 => -127
  • 最大:0111 1111 => 127

这里就有个疑问了,我们熟知的 char 占一个字节,也就是 8 bit 位,但它的取值范围是 -128 ~ 127

-128 是从何而来呢?

计算机中的数字都是以补码存储,则:

  -128
二进制:
1 1000 0000
逆补码(-1):
1 0111 1111
逆反码(取反):
1 1000 0000
十进制:
-128

可以看出,补码 -128 的原码也是 -128

由于是用 8 bit 位存储数据,1 1000 0000 所以应该舍弃最高位的 1

由此得到 1000 0000

按照惯性思维,1000 0000 应该为 -0

但前面说了,有了 0 不需要 -0

所以就用 1000 0000 表示 -128

这样运算也是不影响结果的:

  1 + (-128)
原码:
0000 0001
+
1000 0000
=
1000 0001
逆补码(-1):
1000 0000
逆反码(取反):
1111 1111
十进制:
-127

再来看看代码的运行结果:

#include <stdio.h>

int main() {
char c = -128;
printf("%d", c);
}
-128
#include <stdio.h>

int main() {
char c = -128;
printf("%d", c + 1);
}
-127

由此可以看出计算机正是这样运算的。

C语言 03 原码 反码 补码的更多相关文章

  1. 「C语言」原码反码补码与位运算

    尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解.     本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出.   目录 ...

  2. C语言原码反码补码与位运算.

      目录:     一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算 ...

  3. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...

  4. Java 原码 反码 补码

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  5. JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  6. 原码 & 反码 & 补码 & 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  7. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  8. python之计算机硬件基本认知_数据单位_进制间转换_数的原码反码补码

    一:计算机硬件基本认知 cpu:   中央处理器.   相当于人的大脑.运算中心,控制中心. 内存:  临时存储数据. 优点:读取速度快,缺点:容量小,造价高,断电即消失. 硬盘:  长期存储数据. ...

  9. C 标识符, 数据存储形式(原码,反码,补码)

    一.  标识符 第一个字母必须是英文字母或下划线 二. 数据存储形式(补码存储) 最高位是符号位 ---- 0表示整数 ; 1 表示负数 1. 正数:原码 = 反码 = 补码 例子 : (10) 原码 ...

  10. java基础知识-原码,反码,补码

    1.正数:原码,反码,补码:都一样. 2.负数:和正数的储存方式不同,负数都是以补码形式存储的. <1>负数的补码 把负数的原码除了符号位取反后再+1. <2>负数的原码 把对 ...

随机推荐

  1. 【Azure 应用服务】Azure Function App在部署时候遇见 503 ServiceUnavailable

    问题描述 在VS Code中编写好 Azure Function App代码后,通过  func azure functionapp publish 部署失败,抛出 503 Service Unava ...

  2. 从全球顶级数据库大会 SIGMOD 看数据库发展趋势

    本文来自 NebulaGraph 的软件工程师文豪在美国费城参加 2022 年 SIGMOD 大会时的见闻.SIGMOD 是数据库领域的顶级会议之一,是 CCF 数据库 / 数据挖掘 / 内容检索领域 ...

  3. ClickHouse学习笔记--ClickHouse的整体特性

    本文主要包含如下内容: ClickHouse适用场景 ClickHouse缺点 ClickHouse优点 ClickHouse表引擎-合并树 ClickHouse表引擎-合并树-稀疏索引 ClickH ...

  4. 谈谈Java的特点和优点以及选择Java的原因

    ​ 如果面试官问你:请你说说Java的特点和优点,为什么要选择Java?你该怎么回答? 得分点 Java的特点 Java与C++的区别 Java的优点 标准回答 Java是一门非常纯粹的面向对象的编程 ...

  5. JS4-BOM浏览器对象类型

    什么是BOM 浏览器的顶级对象 页面加载事件以及注意事项 定时器函数 JS执行机制 页面跳转.刷新 history.navigator对象 什么是BOM 浏览器对象模型(Browser Object ...

  6. k8s创建Pod的流程

    Kubernetes(k8s)中Pod的创建过程是一个涉及多个组件协作的复杂流程,下面将详细描述这个过程,确保内容的详尽性和深度. 一.用户提交创建请求 Pod的创建始于用户通过kubectl命令行工 ...

  7. linux环境下基于python的OpenCV 保存视频

    一 概念 在OpenCV中保存视频使用的是VedioWriter对象,在其中指定输出文件的名称, A 创建视频写入的对象 out = cv2.VideoWriter(filename,fourcc, ...

  8. Justep X5 Studio,业界公认第一的快速开发平台

    Justep X5 Studio,业界公认第一的快速开发平台,提供完全可视化.组件化开发环境,具备超强的工作流.组织机构和权限.复杂图表和报表.丰富的业务规则定制能力,以及各种浏览器环境下的复杂业务展 ...

  9. 【atcoder abc276 】(a* 搜索)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  10. 优化您的部署:Docker 镜像最佳实践

    介绍 在快速发展的软件开发和部署领域,Docker 已成为容器化的强大工具,为打包.分发和运行应用程序提供了一种标准化的高效方式.Docker 镜像在这一过程中发挥着至关重要的作用,是容器化应用程序的 ...