为什么8位有符号整数的范围为“-128 ~ +127”

本贴最后更新于 2871 天前,其中的信息可能已经时异事殊

这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题。 原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺。

直到刚才!!!! 就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上直接地,有心地,明显地绕过了这个问题,真是可恶啊。       几经周折,终于把它搞清楚了:  其实,它是计算机底层为了实现数值运算而决定的,涉及非常非常基础的原码,反码,补码知识,一般(99.9999%)都不会用得上。 那0.0001%,估计也就是计算机考试了。 

话说: 用2^8来表示无符号整数的话,全世界的理解都是0 ~ 255了,那么,有符号呢?  用最高位表示符号,0为+,1为-,那么,正常的理解就是 -127 至 +127 了。 这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0,还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同。  于是乎,反码产生了,原因。。。。略,反正,没过多久,反码就成为了过滤产物,也就是,后来补码出现了。 

补码的知识不说了,只说有关+127和-128的。  官方的定义 [-2^(n-1),2(n-1)-1],补码的0没有正负之分。原因呢?没有一本书上有说,这也是我这么火的原因,但通过思考,google,再思考,很快找到答案:

首先,难不免干点白痴般地事情,穷举一下。。。 

正数,原码跟补码一样 

    +127,    0111 1111 
    +126,    0111 1110 
    +125,    0111 1101 
    +124,    0111 1100 
    +123,    0111 1011 
    +122, 0111 1010 
    ……
    +4,   0000 0100   
    +3,  0000 0011   
    +2,  0000 0010   
    +1,  0000 0001 
    0,    0000 0000 (无正负之分) 

下面是负数了

值,  原码,       符号位不变其它取反,  +1 
-1,   1000 0001,   1111 1110,       1111 1111
-2,      1000 0010,   1111 1101,       1111 1110   
-3,      1000 0011,   1111 1100,       1111 1101   
-4,      1000 0100,   1111 1011,       1111 1100   
-5,      1000 0101,   1111 1010,       1111 1011   
-6,      1000 0110,   1111 1001,       1111 1010   
-7,      1000 0111,   1111 1000,       1111 1001   
-8,      1000 1000,   1111 0111,       1111 1000   
-9,      1000 1001,   1111 0110,       1111 0111 
-10,     1000 1010,   1111 0101,       1111 0110 
-11,     1000 1011,   1111 0100,       1111 0101 
-12,     1000 1100,   1111 0011,       1111 0100 
-13,     1000 1101,   1111 0010,       1111 0011 
-14,     1000 1110,   1111 0001,       1111 0010 
-15,     1000 1111,   1111 0000,       1111 0001 
-16,     1001 0000,   1110 1111,       1111 0000 
-17,     1001 0001,   1110 1110,       1110 1111 
…… 
-24,     1001 1000,   1110 0111,       1110 1000 
…… 
-99,     1110 0011,   1001 1100,       1110 0100 
…… 
-124,    1111 1100,   1000 0011,       1000 0100 
-125,    1111 1101,   1000 0010,       1000 0011 
-126,    1111 1110,   1000 0001,       1000 0010 
-127,    1111 1111,   1000 0000,       1000 0001 

看出点什么了没有?  如果没有,那么,给个提示, 再继续下去,下一个补码是什么呢? 

当然是 

    值,  原码,       符号位不变其它取反,  +1 
    -128,     先略过,    再略过,           1000 0000

1000 0000那么,它的原码是什么呢?  从补码求原码的方法跟原码求补码是一样的。 先保留符号位其它求反:  1111 1111, 再加1:11000 0000, 超过了8位了 对,用8位数的原码在这里已经无法表示了。 关键就在这里,补码 1000 0000 为 -128 是不用怀疑的(上面的穷举), 那么,回到原码处, 它的原码也是 1000 0000(超出的自动丢失), 1000 0000 在原码表示什么呢? -0, 但补码却规定0没有正负之分 转换一下思路,看看计算机里,是怎么运算的:  对于负数,先取绝对值,然后求反,加一  -128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000 

现在明确了吧。 

所以, 8位有符号的整数取值范围的补码表示 1000 0000 到 0000 0000, 再到 0111 1111 即 -128 到 0, 再到 127 最终 -128 ~ +127。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 456 关注
  • 笔记

    好记性不如烂笔头。

    306 引用 • 782 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 234 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 96 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 992 回帖 • 1 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 611 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 210 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 582 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 20 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1450 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 320 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 117 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 26 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 58 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 405 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 147 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 350 关注
  • sts
    2 引用 • 2 回帖 • 162 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    207 引用 • 358 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 2 关注