引言

本篇文章属于计算机基础通识,主要讨论:有符号类型、无符号类型的区别,byte、int 等类型的取值范围,最大值最小值的计算公式的由来,原码、反码、补码转换公式。

有符号类型与无符号类型

在 Java 中的八大基本类型:byte、short、int、long、float、double、boolean、char 中,前六个为有符号类型。

有符号类型 无符号类型
byte boolean
short char
int  
long  
float  
double  

所谓有符号类型,指的是这种类型本身可以表示负数正数。注意与整数相互区分。

有符号类型都遵从相同的数值表示规则,即最高位表示符号位。下面以 byte 为例进行讲解。

byte 类型的取值范围

我们知道,byte 类型只表示一个字节,那么它究竟是如何表示正数和负数的呢?

对于有符号类型,我们会将 byte 的 8 位分成两部分——符号位数值位

那么byte 的取值范围就是 -2^7 ~ (2^7 - 1),即 -128 ~ 127。

为什么?

首先我们知道:进制、位数和取值范围是乘方的关系。底数代表进制指数代表位数,所得结果就表示取值数量(地址空间)。如下图所示:

对于正数,取值范围表示的是能够表示的数字的个数,是包含 0 的,就好像数组中长度与最后一个数的索引值,最大值也需要进行减 1 处理,因此最大值就是 2^7 - 1,即 127。

对于负数,符号位用 1 表示,然而如此一来就会出现 -0 和 0 这两个奇怪的数,于是人为规定 1 000 0000 表示 byte 类型范围内的最小值。此时,负数表示的情况下,7 位数值的全部取值都表示一个对应的负数,而正数要去掉 1 个 全 0 的值用来表示数字 0,因此很明显负数要比正数多 1 个数。即 负数可以有 2^7 个,于是最小的数就是 -2^7 ,即 -128。

原码、反码、补码

原码,反码,补码的产生过程,就是为了解决,计算机做减法和引入符号位(正号和负号)的问题。

原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。一般情况下,原码就单独处理符号位的一种表示方式,如 -5的8位原码是:1000 0101;-3 的 8位原码是 1000 0011;8 的原码是 0000 1000。注意,如果某个负数取绝对值后超出位数所能表示的最大值,比如 -128 ,取模后是128 超出了 byte 类型的表示最大值 127,那么 -128 就没有原码。

反码是原码除符号位之外的按位取反。如 -5 的 8 为反码是 1111 1010;-3 的反码是 1111 1100 ;8的反码是 0111 0111。

在计算机系统中,数值一律用补码来表示和存储。

原因在于,原码虽然简单直观,但是计算的时候需要特别将符号位和数值位区分处理,这无形增加了硬件的开销和复杂性,而使用补码,可以将符号位和数值位统一处理。

上面部分提到了有符号数的取值范围,它们包含了许多负数,然而,如果单从表面上观察,很难将一个负数与其计算机内部的二进制表现形式联系起来,比如:byte 类型的 -128,它在计算机内部的表示是:1000 0000;-125 对应 ‭1000 0011‬ 。

那么我们就需要了解原码、反码、补码的转换规则才能快速完成 编码的转化。

首先,对于正数来说,人为规定:原码、反码、补码完全一样。除了高位为 0 以外,剩余的 数值位,可以快速通过 2进制与 16进制的转化规则确定,比如 byte 类型的 125 ,十六进制是:7D,那么原码、反码、补码都是 ‭0111 1101‬ 。

对于负数,补码(计算机中实际表示的编码)的计算规则为:原码取反再加一

另外,补码到原码的转换也可以通过 先取反,再加一的方式得到,不需要先减一再取反,这样的特性降低了电路逻辑的复杂性,也是补码流行起来的原因。

short、int 等有符号类型的类推

short 、 int 等其他有符号类型的值,除了字节数不同、位数较多以外,其他所有的规律都是类似的。

如int 类型,它在计算机中以 4 个字节表示,总共32 位,最高位也同样表示 正负,那么数值位总共就有 31 位,那么 int 的表示范围就是 : -2^31 ~ (2^31 - 1)。推理方式和 前面 byte 是完全一样的。

总之,一定要记住,在计算机中,所有负数 都是由补码来表示的,而正数 直接用原码表示(但实际上也是补码,只不过规定正数的补码、反码和 原码要完全一致)

基本类型理解巩固及补码原理总结相关推荐

  1. 原码反码补码原理理解

    原码反码补码原理理解 基础知识 原码 定义 在这里,我们模仿一下计算机对数据运算的过程! 那么所有运算都是正确的吗?我们再试一组. 反码 定义 在这里,我们模仿一下计算机对数据运算的过程! 正数加负数 ...

  2. 【分布式ID】理解Snowflake算法的实现原理

    1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...

  3. 深入理解CPU的调度原理

    前言 软件工程师们总习惯把OS(Operating System,操作系统)当成是一个非常值得信赖的管家,我们只管把程序托管到OS上运行,却很少深入了解操作系统的运行原理.确实,OS作为一个通用的软件 ...

  4. 京东面试官:你是怎么理解 MySQL 的优化原理的?

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用 SELECT*.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...

  5. 补码原理——负数为什么要用补码表示

    文首   我们都知道负数在计算机中是以补码(忘了补码定义的戳这里)表示的,那为什么呢?本文尝试了解补码的原理,而要想理解它,首先得理解算术中"模"的概念.所以首先看一下什么是模,然 ...

  6. 来!带你深入理解分布式事务:原理与实战!

    随着互联网的不断发展,互联网企业的业务在飞速变化,推动着系统架构也在不断地发生变化.总体来说,系统架构大致经历了 单体应用架构→垂直应用架构→分布式架构→SOA架构→微服务架构的演变. 如今微服务技术 ...

  7. 理解了DirectShow播放原理

    http://blog.sina.com.cn/s/blog_4137eb6101009oha.html 在这个"BT"的时代我们为什么"BT",相信绝大多数人 ...

  8. 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

    文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...

  9. [diango]理解django视图工作原理

    前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...

最新文章

  1. 联手小米,雀巢中国推出健康管家Nesfinity,满足个性化生活需求管理
  2. SAP RETAIL WB02 为门店激活物料分类账报错 - ML currencies are not integrated in FI for valuation area m123 NMI1 –
  3. 网络流24题之魔术球问题
  4. 浏览器与服务器通信技术——Ajax详解
  5. php larval开发规范,数据模型 |《 Laravel 项目开发规范 5.5》| Laravel China 社区
  6. Codeforces Round #324 (Div. 2) B. Kolya and Tanya 快速幂
  7. Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结
  8. 电脑中linux系统在哪里设置密码,linux添加一个root级别账户并设置密码linux操作系统 -电脑资料...
  9. UWP 手绘视频创作工具技术分享系列 - 位图的绘制
  10. Windows下搭建SVN服务器 - Visual SVN server
  11. 三个基本的布尔逻辑算符是_常用布尔逻辑运算符有哪些
  12. python_d05
  13. 使用Python进行12306抢票
  14. 计算机毕业设计项目推荐 - 毕设开题选题
  15. 时间工具类、Instant、date、LocalDate、String、LocalDateTime 相互转换
  16. Tomcat在IIS下同端口运行方法(我用的tomcat8.5 iis 10网上各种坑)
  17. html5div随窗口大小,css怎么设置div随着窗口大小变换
  18. 跟驰理论 matlab,[经济学]第5章 跟驰理论.ppt
  19. 曲神的hu测 T2.Van(左偏树+dp)T3.Gay
  20. linux 识别u盘,移动硬盘,固定硬盘

热门文章

  1. 为什么wait和notify必须放在synchronized中?
  2. 漫话:如何给女朋友解释String对象是不可变的?
  3. javascript 懒加载技术(lazyload)简单实现
  4. SQL事务控制语言(TCL)
  5. 计算机辅助设计教案板书,计算机辅助设计教案计机辅助设计教案.doc
  6. TCP、UDP相关协议使用的端口号
  7. 活动安排问题的 动态规划和贪心算法
  8. C++PrimerPlus学习——第四章编程练习
  9. hive启动报错:Exception in thread “main“ java.lang.NoSuchMethodError: com.google.common.base.Precondition
  10. linux用户的配置文件保存在哪里,使用配置文件(.settings、.config)存储应用程序配置...