基本类型理解巩固及补码原理总结

引言

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

有符号类型与无符号类型

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

有符号类型无符号类型
byteboolean
shortchar
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 是完全一样的。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年3月15日_读书|总结笔记目录

深入理解Java虚拟机*第三版 慢慢填坑第一部分*自动内存管理 第二部分*虚拟机执行子系统 类文件结构 无关性的基石

LeetCode(#118)————杨辉三角形

问题描述 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例: 输入: 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ] 实现方法 class Solution {public List<List<Intege…

数据结构与算法————九九乘法表

问题描述 通过Java语言实现九九乘法表的输出。使用一个for 循环和两个for循环。 一个for循环 public static void oneFor() {for (int i 1, j 1; i < 9; j) {System.out.print(j "*" i "" i * j "\t");if (j i) {i;j 0;System.ou…

JVM001_类文件结构

无关性的基石 实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不与任何语言绑定&#xff08;包括Java&#xff09;&#xff0c;它只与‘Class文件’这种特定的二进制文件格式所关联。Class文件中包含了Java虚拟机指令集、符号表以及其它辅助信息。出于安全考虑&…

Maven学习(六)————企业Maven项目最佳实践

引言 在《Maven学习&#xff08;三&#xff09;————Maven核心概念&#xff08;二&#xff09;》中&#xff0c;学到了Maven 继承和 Maven 聚合的概念&#xff0c;这两个概念&#xff0c;解决的问题分别是&#xff1a; 1、解决一些公共依赖统一版本的问题。 2、统一打包部署…

Oracle查询表|注释|字段|字段注释

当前用户所有用户DBA备注user_tablesall_tablesdba_tables表user_tab_commentsall_tab_commentsdba_tab_comments表注释user_tab_columnsall_tab_columnsdba_tab_columns表字段user_col_commentsall_col_commentsdba_col_comments字段注释user_objectsall_objectsdba_objects可…

JVM003_属性表

属性表 预备知识 javac -g Xxx.java 在生成class文件的时候生成所有调试信息javap -v Xxx.class 输出附加信息 属性表结构 类型名称数量备注u2attribute_name_index1属性名称索引&#xff0c;指向一个CONSTANT_Utf8_info型常量的索引u4attribute_length1该属性表的长度u1in…

Lombok ——自动化方法生成器

引言 此文为简单的Lombok 演示。 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具&#xff0c;通过使用对应的注解&#xff0c;可以在编译源码的时候生成对应的方法。简而言之&#xff0c;一句话就是&#xff1a;通过简单的注解…

JVM004_字节码指令简介

字节码指令简介 Java虚拟机指令由操作码&#xff08;Opcode&#xff09;和跟随其后的零至多个操作数&#xff08;Operand&#xff09;组成。 操作码&#xff1a;一个字节长度的&#xff0c;代表某种特定操作含义的数字。 操作数&#xff1a;操作码需要的参数。 字节码与数据…

LeetCode(#26)————删除排序数组中的重复项

题目 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums […

JVM005_synchronized、同步指令、管程、MESA

synchronized、同步指令、管程、MESA synchronized是Java的一个关键词&#xff0c;可以保证方法或者代码块在运行时&#xff0c;同一时刻只有一个方法可以进入到临界区&#xff0c;保证了原子性、可见性、有序性。 临界资源一次只能被一个线程访问的资源。 **临界区:**访问临…

MySQL————表维护相关低频操作总结

引言 一些对表结构的修改操作是日常数据库操作中非常低频的&#xff0c;这就好像盖完了一栋楼之后&#xff0c;很少会去动地基&#xff0c;不过这种情况在实际开发当中并非完全没有可能&#xff0c;因此&#xff0c;此篇博客主要总结表结构修改相关的语句。 一、备份表 如果…

JVM006_类加载的过程

类加载 类加载时机 类加载的过程 新术语 类加载器 简单的理解为将类转换为二进制流的类或接口。 数组的元素类型 数组去掉所有维度的类型。 数组的组件类型 数组去掉一个维度的类型。 基本块 按照控制流拆分的代码块。 1. 加载 加载是类加载过程的一个阶段。加载阶段主…

服务端开发——云服务器的端口转发设置(SSH隧道)

引言 本篇博客介绍端口转发的知识&#xff0c;并详细阐述操作和设置步骤。这是因为在实际工作中&#xff0c;会有很多企业从安全的角度考虑&#xff0c;为线上或重要的服务器设置一个跳板机&#xff08;堡垒机&#xff09;&#xff0c;避免远程开发人员直接操作&#xff0c;是…

JVM007_运行时栈帧结构

运行时栈帧结构 执行引擎是JVM的核心组件之一。 所有Java虚拟机的执行引擎输入输出都是一致的&#xff1a;输入的是字节码二进制流&#xff0c;处理过程是字节码解析执行的等效过程&#xff0c;输出的是执行结果。 JVM以方法作为作基本的执行单元。“栈帧”是用于支持虚拟机进…

Shiro————核心设计思想

引言 以此篇博客为引&#xff0c;开启一个新的专栏分类——Shiro。 之前在工作中有比较快速的学习过Shiro安全框架&#xff0c;但经过一年的荒废&#xff0c;已经不是很熟悉了&#xff0c;通过这个系列&#xff0c;深入研究和学习Shiro的一些知识&#xff0c;填补安全管理方面…

Web应用安全————账号冻结与 Session 实时失效

引言 开篇时说些题外话&#xff0c;最近刚刚被公司CY&#xff0c;不过很快找到了下家&#xff0c;也同时拿到了三家公司的Offer。一周面试下来&#xff0c;总体感觉面试题少了&#xff0c;不过多了上机程序题。新公司是做外包&#xff0c;不过相比于上一家公司&#xff0c;也算…

Web应用安全————Shiro 解决会话固定漏洞

引言 承接上一篇《Web应用安全————账号冻结与 Session 实时失效》关于 session 的学习&#xff0c;本篇博客聚焦如何通过 shiro 解决会话固定导致的漏洞问题。 首先&#xff0c;没怎么接触过应用安全方面的小伙伴可能会发起疑问 - 什么是会话固定&#xff1f; 简单来说&…

Web应用安全————多点登录互斥

引言 在实际生活中&#xff0c;很多网站都做了多点登录互斥的操作&#xff0c;简单来说就是同一个账号&#xff0c;只能在一台电脑上登录&#xff0c;如果有人在其他地方登录&#xff0c;那么原来登录的地方就会自动下线&#xff0c;再进行操作就会弹出登录界面。 实现思路 …

Shiro————会话管理

引言 本篇博客翻译自Shiro 官方网站的 Session Manager 手册。 网页地址&#xff1a;http://shiro.apache.org/session-management.html Shiro 会话管理支持的特性 基于POJO/J2SE&#xff08;IoC容器友好的&#xff09;- Shiro 中的所有东西都是基于接口的&#xff0c;而且…