java int类型底层存储&原码&反码&补码

java的int类型

Java的原始类型里没有无符号类型,c语言int类型表示有符号整型,unsigned int无符号整型

int占4个字节,每个字节8位,占32位,取值范围 -231~231-1,有32个0-1的二进制位。

左起第一位是符号位, 0表示正数,1表示负数 其余后面31位是数值位。

0 0000000000000000000000000000010

数字0的表示: 按照上面提到的符号,有两种0的表示方法,即”+0″和”-0″。 实际上,在32位系统下int类型中,计算机已经强行规定数字0采用”+0″的表示方法,即00000000 00000000 00000000;而”-0″这个特殊的数字被定义为了-2^31。 因此我们看到32位系统下int类型的取值范围中,负数部分比正数部分多了一个数字,正数的最大取值是231-1,而负数的最小取值是-231。正数部分之所以要减去1,是因为被数字0占用了,而负数部分不需要用来表示0,因此原本的”-0″就用来表示-2^31这个数字。

那么-1按照上面描述就是: 10000000 00000000 00000001 了?左起第一位是符号位1表示负数?右起第一位是数值1? 实际不是这样的。这里就需要引入”补码”了。

计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示”正”,用1表示”负”,而数值位,三种表示方法各不相同。

原码

最高位1表示负,0表示正,剩余位表示数值。

原码的1: 00000000000000000000000000000001

原码的-1:10000000000000000000000000000001

原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0 ,原码计算则是

00000000000000000000000000000001+10000000000000000000000000000001=-2 是错的。

原码的符号位不能直接参与运算。

反码

正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

对于正数和”+0″而言,其原码本身就是反码,例如 8位二进制”+1″,其原码与反码都是00000001;

对于负数和”-0″而言,符号位与原码中一样,保持不变,其余位数逐位取反,1换成0,0换成1,例如 “-1″,其8位二进制原码是1000 0001,其反码是1111 1110;

那么我们是否已经可以正常进行运算了呢?

我们举个三个例子:

例一:1+2=3(以8位二进制表示)

十进制 原码 反码 1 0000 0001 0000 0001 2 0000 0010 0000 0010 结果(反码) 0000 0011 结果(原码) 0000 0011 结果(十进制) 3

计算结果正确。

例二:1+(-2)=-1

十进制 原码 反码 1 0000 0001 0000 0001 -2 1000 0010 1111 1101 结果(反码) 1111 1110 结果(原码) 1000 0001 结果(十进制) -1

计算结果正确。

例三:1+(-1)=0

十进制 原码 反码 1 0000 0001 0000 0001 -1 1000 0001 1111 1110 结果(反码) 1111 1111 结果(原码) 1000 0000 结果(十进制) -0

计算结果为-0,问题来了,由于-0的存在,使得二进制与十进制的互换不再是一一对应的关系。

总结:由于-0这个问题的存在,会使得计算机需要增加额外的物理硬件配合运算,所以在计算机发展的早期就已经抛弃了使用反码储存数据。

补码

补码正是基于反码的”-0″问题诞生的,可以解决这个问题。

补码的计算方法是:正数和+0的补码是其本身,负数则先计算其反码,然后反码加上1,得到补码。

补码换算为原码的过程中,如果补码是正数或者+0的补码,则其原码就是补码本身;如果补码是负数或者-0的补码,则其原码的计算方法是,先将补码减掉1,得到反码,再将反码取反,得到原码。

例一:1+(-1)=0

十进制 原码 反码 补码 1 0000 0001 0000 0001 0000 0001 -1 1000 0001 1111 1110 1111 1111 结果(补码) 0000 0000 结果(反码) 0000 0000 结果(原码) 0000 0000 结果(十进制) +0

计算结果正确,+0即是数字0的唯一表示。

例二:1+2=3

十进制 原码 反码 补码 1 0000 0001 0000 0001 0000 0001 2 0000 0010 0000 0010 0000 0010 结果(补码) 0000 0011 结果(反码) 0000 0011 结果(原码) 0000 0011 结果(十进制) 3

计算结果正确。

特别地,我们加入例四:(-1)+(-127)=-128

我们知道8位二进制的符号数的取值范围是(-27)~(27-1),即-128~127。

十进制 原码 反码 补码 -1 1000 0001 1111 1110 1111 1111 -127 1111 1111 1000 0000 1000 0001 结果(补码) 1000 0000 结果(反码) 结果(原码) 结果(十进制) -128

由于补码1000 0000具有特殊性,计算机在编写底层算法时,将其规定为该取值范围中的最小数-128,其值与(-1)+(-127)的计算结果正好符合。

补充一点,8位二进制补码1000 0000没有对应的反码和原码,其他位数的二进制补码与此类似。

int类型在内存中,以补码的形式存储。而且我们还知道了为何int类型的取值范围中负数的最小值的绝对值比正数的最大值大1的原因,即-2^32的补码是10000000 00000000 00000000,原本-0的位置被-2^32取代了

二进制数在内存中以补码的形式存储

正数:原码、补码和反码都相同

负数:补码符号位不变,其它位是对应正数的原码取反加一

欢迎关注个人公众号一起交流学习:

java int类型底层存储&原码&反码&补码

Original: https://www.cnblogs.com/lihaoyang/p/14156988.html
Author: 我俩绝配
Title: java int类型底层存储&原码&反码&补码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537285/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2020年度钻石C++C学习笔记(3)–《博学谷》

    1.Unix/Linux操作系统介绍 1.1 操作系统的作用 1.1.1 操作系统的目标 l 方便:使计算机系统易于使用 l 有效:以更有效的方式使用计算机系统资源 l 扩展:方便…

    Java 2023年6月7日
    075
  • 重看Maven技术

    我使用Maven主要用于包管理。 安装,配置环境变量这些就不说了。 Maven提供的标准目录结构 Maven3的目录结构如下图所示 src -main     –java java…

    Java 2023年6月5日
    066
  • 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了。让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习。 背景: 在做项目的时候,…

    Java 2023年5月30日
    060
  • SpringBoot扩展配置

    一、配置随机数 RandomValuePropertySource可以用于注入随机数,它支持integer、long、uuid、string。 my.secret=${random…

    Java 2023年5月30日
    060
  • 后端开发学习记录(四)——Mybatis的学习

    Mybaits Mybaits官方文档 官方文档mybatis – MyBatis 3 | Introduction Mybaits 一、简介 Ⅰ什么是Mybaits MyBati…

    Java 2023年6月13日
    085
  • Fizz企业级微服务网关-服务编排,祭出终结BFF层的大杀器

    概述 服务编排是Fizz网关提供的一个强大的功能,能够基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口,减少中间层胶水代码以及降低编码投入。本文介绍服务编排三个常见场景…

    Java 2023年6月9日
    072
  • 安利一个Mac下好用的抓包工具-Charles

    Charles:让天底下没有难抓的包。 前言 今天给大家推荐一个我所使用过的抓包工具中最好用的抓包工具-Charles(音译:查尔斯),它可以抓各端发起的网络请求,我主要用来抓移动…

    Java 2023年6月14日
    0131
  • Linux基础入门笔记

    Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统,是一…

    Java 2023年6月7日
    053
  • JAVA PDF 截取N页,生成新文件,转图片

    JAVA PDF 截取N页,生成新文件,转图片 import com.itextpdf.text.Document; import com.itextpdf.text.pdf.Pd…

    Java 2023年6月13日
    072
  • 字典生成

    crunch的使用 依然是熟悉的console-crunch-xxx min:设定最小字符串长度 max:设定最大字符串长度 -o:将生成的字典保存到指定文件 -t:指定密码输出的…

    Java 2023年6月7日
    070
  • Failed to get D-Bus connection: Operation not permitted

    学docker时,使用 systemctl命令报错: Failed to get D-Bus connection: Operation not permitted 网上查询发现是…

    Java 2023年6月9日
    063
  • 医院信息平台管理(医院信息集成平台)—— 概念扫盲

    引子 以患者电子病历的信息采集、存储和集中管理为基础,连接临床信息系统和管理信息系统的医疗信息共享和业务协作平台,是在区域范围支持实现以患者为中心的跨机构医疗信息共享和业务协同服务…

    Java 2023年5月29日
    095
  • JAVA 基础(1)开发环境的搭建以及开发工具的选择

    我们现在还是在学习阶段因此我们不用配置那么多的jdk,配置一个jdk8就够应付日常的学习了。前面的文章我尽量写详细一些照顾刚入坑的朋友。后文还有教大家怎么使用企业版的idea。 一…

    Java 2023年6月13日
    063
  • 使用Jsonp实现跨域请求

    showData( {"data":[{"u":"/products/1.html","n":&qu…

    Java 2023年6月7日
    063
  • 用浏览器连接服务器-安装新的虚拟机

    (1)在浏览器上输入https://10.100.0.249/ – 登录 (2)选中”虚拟机”,右键选择”创建/注册虚拟机&#822…

    Java 2023年5月30日
    080
  • JS 模块化- 05 ES Module & 4 大规范总结

    1 ES Module 规范 ES Module 是目前使用较多的模块化规范,在 Vue、React 中大量使用,大家应该非常熟悉。TypeScript 中的模块化与 ES 类似。…

    Java 2023年6月16日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球