二进制的编码(原码、反码、补码)

1.二进制怎么编码?

1字节 = 8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或1,如果是我们常见的10进制,那就8位都为9)1字节的二进制数中,最大的数:11111111。

这个数的大小是多少呢?让我们来把它转换为十进制数。

无论是什么进制,都是左边是高位,右边是低位。10进制是我们非常习惯的计数方式,第一位代表有几个1(即几个100),第二位代表有几个10(即几个101),第三位代表有几个100(即有几个102)…,用小学课本上的说法就是:个位上的数表示几个1,十位上的数表示向个10,百位上的数表示几个100……

同理可证,二进制数则是:第1位数表示几个1 (20),第2位数表示几个2(21),第3位数表示几个4(22),第4位数表示向个8(23)……

以前我们知道1个字节有8位,现在通过计算,我们又得知:1个字节可以表达的最大的数是255,也就是说表示0~255这256个数。

那么两个字节(双字节数)呢?双字节共16位。 1111111111111111,这个数并不大,但长得有点眼晕,从现在起,我们要学会这样来表达二制数:1111 1111 1111 1111,即每4位隔一空格。

双字节数最大值为:1 * 2^15 + 1 *2^14 + 1* 2^13 + 1 * 2^12 + 1 * 2^11 + 1 * 2^10 + …… + 1 * 2^2 + 1 * 2^1 + 1* 2^0 = 65535

很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。具体的计算方法方法是,如果它有n位,那么最大值就是:n位二进制数的最大值:1 * 2^(n-1) + 1 * 2^(n-2) + ... + 1 * 2^0

2、理解有符号数和无符号数

负数在计算机中如何表示呢?这一点,你可能听过两种不同的回答。

一种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一说就得一节课,用“补码”表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以得到答案。

另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它不能解释,为什么字符类型的-1用二进制表示是“1111 1111”(16进制为FF);而不是我们更能理解的“1000 0001”。(为什么说后者更好理解呢?因为既然说最高位是1时表示负数,那1000 0001不是正好是-1吗?)。让我们从头说起。

3、你自已决定是否需要有正负。

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。

在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。

数值类型分为整型或实型,其中整型又分为无符类型或有符类型 (unsigned int, signed int),而实型float则只有有符类型。

字符类型也分为有符和无符类型 (unsigned char, signed char)。

4、使用二制数中的最高位表示正负。

首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。(红色为最高位)

单字节数: 1111 1111

双字节数: 1111 1111 1111 1111

四字节数: 1111 1111 1111 1111 1111 1111 1111 1111

  • 当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。
  • 当我们指定一个数量是有符号类型时,此时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。

5、无符号数和有符号数的范围区别。

无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:

无符号数: 1111 1111   值:255         1* 2^7 + 1* 2^6 + 1* 2^5 + 1* 2^4 + 1* 2^3 + 1* 2^2 + 1* 2^1 + 1* 2^0

有符号数: 0111 1111   值:127         1* 2^6 + 1* 2^5 + 1* 2^4 + 1* 2^3 + 1* 2^2 + 1* 2^1 + 1* 2^0

同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。

不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:

无符号数:                         0 ----------------- 255                  0000 0000 ---------------1111 1111

有符号数:                  -128 --------- 0 ---------- 127             1000 0000 ----------------0111 1111

同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。

6、一个有符号的数据类型的最小值是如何计算出来的呢?

有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位。但在负值范围内,数值的计算方法不能直接使用1* 2^6 + 1* 2^5 +...的公式进行转换。在计算机中,负数除为最高位为1以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这里,先直观地看一眼补码的形式:

以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。

那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。

然而,事实上计算机中的规定有些相反,请看下表:

首先我们看到,从-1到-128,其二进制的最高位都是1(表中标为红色),正如我们前面的学。

然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0;而1000 0001也不是拿来直观地表示-1。事实上,-1 用1111 1111来表示。怎么理解这个问题呢?先得问一句是-1大还是-128大

当然是 -1 大。-1是最大的负整数。以此对应,计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。

我们以-1为例,来看看不同字节数的整数中,如何表达-1这个数:

可能有同学这时会混了:为什么 1111 1111 有时表示255,有时又表示-1?所以我再强调一下:你自已决定一个数是有符号还是无符号的。写程序时,指定一个量是有符号的,那么 当这个量的二进制各位上都是1时,它表示的数就是-1;相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说, 最大值就是255。

7、个人总结

1000 0000表示-128是人为规定的,不然会有+0和-0之分

负数除最高位是1以外,还采用补码形式表达,所以在十进制计算前要对补码进行还原,即补码-1再取反。

计算机用补码表示负数:+128原码是1000 0000,反码是0111 1111,补码是0111 1111+1=1000 0000表示-128

对于有符号数:

1.  最高位四符号位,0表示整数,1表示负数

2.  正数的原码,反码,补码相同

3.  负数的反码=原码符号位不变,其他为取反

4.  负数的补码=它的反码+1

5.  0的反码,补码都是0

6.  计算机运算时,都是以补码的方式来运算的

example:1-2=1+(-2),在计算机中,1的补码:0000 0001,-2的原码:1000 0010,-2的反码:1111 1101,-2的补码:1111 1110,补码相加:0000 0001+1111 1110=1111 1111,再将结果转成原码(减1取反),减1得到反码:1111 1110,取反得到原码:1000 0001,转成原码后才能转成十进制结果:-1,-1的补码是1111 1111,1111 1111即-1在计算机中的表示。

二进制的编码(原码、反码、补码)相关推荐

  1. 二进制八进制十进制十六进制及原码反码补码

    1.进制的介绍 定义:进位制,人们规定的一种进位方式:表示某一位置上的数,运算时是逢X进一位. 十进制是逢十进一:二进制是逢二进一,八进制是逢八进一: 常见进制:二进制,八进制,十进制,十六进制: 学 ...

  2. 【程序员必修数学课】-基础思想篇-二进制-原码反码补码的数学论证

    二进制计数法&原码&反码&补码 Ⅰ 前言 Ⅱ 二进制计数法 A. 什么是二进制计数法? B. 为什么要使用二进制? C. 二进制的位运算 D. 符号位 E. 溢出 Ⅲ 原码&a ...

  3. 二进制原码反码补码详解

    二进制原码反码补码 首先我们在了解什么是原码,反码,补码之前,我们先来谈谈为什么需要有这些,只要原码不行吗? 答案肯定是不行的!

  4. 关于计算机中 原码, 反码, 补码 详解

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

  5. 原码, 反码, 补码, 移码 详解

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

  6. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  7. 原码 反码 补码 详解

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

  8. 原码, 反码, 补码详解——北大陈向群老师课堂笔记

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符 ...

  9. 原码, 反码, 补码 详解

    本文转载于: 作者:张子秋 出处:http://www.cnblogs.com/zhangziqiu/ 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进 ...

  10. Java修炼之凡界篇 筑基期 第02卷 语法 番外1 原码 反码 补码

    原码 反码 补码 博客整理自 原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 (cnblogs.com) 机器数与真值 在学习原码.反码和补码之前,需要先了解什么是机器数,什么是真 ...

最新文章

  1. Apache、Nginx、Tomcat、PHP的区别
  2. Opencv深拷贝与浅拷贝
  3. 【渝粤教育】电大中专电商运营实操作业 题库
  4. php %3c%3c%3cxml 报错,代码审计| APPCMS SQL-XSS-CSRF-SHELL
  5. 网络操作系统 第七章 管理TCP/IP网络
  6. 敏捷开发智慧敏捷系列之五:定不定流程和模板?
  7. 在 GitHub 上提交代码必备指南!
  8. ICP算法(Iterative Closest Point迭代最近点算法)
  9. 公司怎么吸引和留住核心技术大牛
  10. require.js使用教程
  11. Android TV开发总结(七)构建一个TV app中的剧集列表控件
  12. 获取extjs 选择后的表头_OD数据获取脚本分享
  13. 公告:CSDN下载频道即将全面改版
  14. 速卖通开放平台调用菜鸟组件实现云打印
  15. JS高级程序设计(10)
  16. 不加好友实现QQ在线代码状态临时会话
  17. python实现简单银行管理系统
  18. 如何用GIS做城市购房选址分析
  19. jmap 几个慎用操作
  20. jsonpath学习资料

热门文章

  1. 小米、OPPO、vivo的“枪手博弈”,小米会先出局?
  2. 十进制转换为十六级进制方法!!! 简单!!正解
  3. Thallium病毒分析
  4. JavaScript CSS Style属性对照表
  5. ffmpeg 采集摄像头yuv数据
  6. 辞退员工的未休年假要如何补偿
  7. 去掉xp系统ftp服务器密码,xp系统ftp服务器密码
  8. linux_文件类型
  9. iOS 系统自带定位
  10. 蓝桥杯真题跑步锻炼(Excel快速准确解法)