基本类型理解巩固及补码原理总结
引言
本篇文章属于计算机基础通识,主要讨论:有符号类型、无符号类型的区别,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 是完全一样的。
总之,一定要记住,在计算机中,所有负数 都是由补码来表示的,而正数 直接用原码表示(但实际上也是补码,只不过规定正数的补码、反码和 原码要完全一致)。
基本类型理解巩固及补码原理总结相关推荐
- 原码反码补码原理理解
原码反码补码原理理解 基础知识 原码 定义 在这里,我们模仿一下计算机对数据运算的过程! 那么所有运算都是正确的吗?我们再试一组. 反码 定义 在这里,我们模仿一下计算机对数据运算的过程! 正数加负数 ...
- 【分布式ID】理解Snowflake算法的实现原理
1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...
- 深入理解CPU的调度原理
前言 软件工程师们总习惯把OS(Operating System,操作系统)当成是一个非常值得信赖的管家,我们只管把程序托管到OS上运行,却很少深入了解操作系统的运行原理.确实,OS作为一个通用的软件 ...
- 京东面试官:你是怎么理解 MySQL 的优化原理的?
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用 SELECT*.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...
- 补码原理——负数为什么要用补码表示
文首 我们都知道负数在计算机中是以补码(忘了补码定义的戳这里)表示的,那为什么呢?本文尝试了解补码的原理,而要想理解它,首先得理解算术中"模"的概念.所以首先看一下什么是模,然 ...
- 来!带你深入理解分布式事务:原理与实战!
随着互联网的不断发展,互联网企业的业务在飞速变化,推动着系统架构也在不断地发生变化.总体来说,系统架构大致经历了 单体应用架构→垂直应用架构→分布式架构→SOA架构→微服务架构的演变. 如今微服务技术 ...
- 理解了DirectShow播放原理
http://blog.sina.com.cn/s/blog_4137eb6101009oha.html 在这个"BT"的时代我们为什么"BT",相信绝大多数人 ...
- 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架
文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...
- [diango]理解django视图工作原理
前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...
最新文章
- 联手小米,雀巢中国推出健康管家Nesfinity,满足个性化生活需求管理
- SAP RETAIL WB02 为门店激活物料分类账报错 - ML currencies are not integrated in FI for valuation area m123 NMI1 –
- 网络流24题之魔术球问题
- 浏览器与服务器通信技术——Ajax详解
- php larval开发规范,数据模型 |《 Laravel 项目开发规范 5.5》| Laravel China 社区
- Codeforces Round #324 (Div. 2) B. Kolya and Tanya 快速幂
- Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结
- 电脑中linux系统在哪里设置密码,linux添加一个root级别账户并设置密码linux操作系统 -电脑资料...
- UWP 手绘视频创作工具技术分享系列 - 位图的绘制
- Windows下搭建SVN服务器 - Visual SVN server
- 三个基本的布尔逻辑算符是_常用布尔逻辑运算符有哪些
- python_d05
- 使用Python进行12306抢票
- 计算机毕业设计项目推荐 - 毕设开题选题
- 时间工具类、Instant、date、LocalDate、String、LocalDateTime 相互转换
- Tomcat在IIS下同端口运行方法(我用的tomcat8.5 iis 10网上各种坑)
- html5div随窗口大小,css怎么设置div随着窗口大小变换
- 跟驰理论 matlab,[经济学]第5章 跟驰理论.ppt
- 曲神的hu测 T2.Van(左偏树+dp)T3.Gay
- linux 识别u盘,移动硬盘,固定硬盘
热门文章
- 为什么wait和notify必须放在synchronized中?
- 漫话:如何给女朋友解释String对象是不可变的?
- javascript 懒加载技术(lazyload)简单实现
- SQL事务控制语言(TCL)
- 计算机辅助设计教案板书,计算机辅助设计教案计机辅助设计教案.doc
- TCP、UDP相关协议使用的端口号
- 活动安排问题的 动态规划和贪心算法
- C++PrimerPlus学习——第四章编程练习
- hive启动报错:Exception in thread “main“ java.lang.NoSuchMethodError: com.google.common.base.Precondition
- linux用户的配置文件保存在哪里,使用配置文件(.settings、.config)存储应用程序配置...