java 整数变负数_一文帮你读懂Java整数的存储原理

前言

大家应该都知道,整数包括负数,零,和正数。在Java中,基本类型中byte(8位)、short(16位)、int(32位)、long(64位)属于整数,并且没有无符号数,均是有符号的。对于计算机来说,它只认识二进制,也就是0和1,那我们开发过程中所使用的整数(大多是10进制)在计算机中是怎么存储成二进制的呢?本文将详细解读Java整数在计算机中的存储原理。

整数的编码方式

303b23974a106f035ec773abff53625f.png

整数的编码分为原码、反码和补码。计算机使用的是补码的存储方式。它们的定义如下:

原码:在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。

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

补码:正数的补码与其原码相同,负数的补码就是对该负数的反码加1。

因为计算机是以补码来存储整数的,所以补码就显得很重要。那么如何计算整数的补码呢?下面以具体例子来说明。

100 -> 原码/反码/补码:01100100

0 -> 原码/反码/补码:00000000

-100 -> 原码:11100100 -> 绝对值:01100100 -> 取反加1:10011011+1 -> 补码:10011100

1 -> 原原码/反码/补码:00000001

-1 -> 原码:10000001 -> 绝对值:00000001 -> 取反加1:11111110+1 -> 补码:11111111

127 -> 原码/反码/补码:01111111

-128 -> 绝对值:10000000 -> 取反加1:01111111+1 -> 补码:10000000

从定义可以看出,正数的补码,反码,原码相同。0的补码就是本身。

那么负数的原码和补码如何转换呢?

  • 已知一个负数求补码方法:绝对值原码按位求反加1。
  • 已知负数补码求负数方法:符号位不变,其他位按位求反加1。
dc56409c45f6fc9fc3fb14108a3d0827.png

有了原码,为什么还要用补码来存储整数

下面我们以基本类型byte为例来说明这个问题,

因为byte是8bit,从理论上讲,如果利用充分的话,那么它应该可以表示2^8=256个数值。

如果采用原码来存储

1 - 1 = 1 + ( -1 ) =(00000001) + (10000001) = (10000010) = -2 这显然是不正确的。

原码在两个整数的加法运算中是没有问题的,问题出现在带符号位的负数身上。原码无法满足运算要求。

如果采用反码来存储

反码的取值空间和原码相同且一一对应。所以反码的表示范围位:-127到-0到+0到+127,共255个数值,这里我们把+0和-0都当成0对待。

下面是反码的减法运算:

1 - 1 = 1 + ( -1 )= (00000001) + (11111110) = (11111111) = ( -0 ) 没问题。1 – 2 = 1 + ( -2 ) = (00000001) + (11111101) = (11111110) = ( -1 ) 正确。

反码的问题出现在(+0 : 00000000)和(-0 : 11111111)上,因为在人们的计算概念中零是没有正负之分的。

如果采用补码来存储

 1 - 1 = 1 + (-1) = (00000001) + (11111111) = (00000000) = 0 正确。 1 – 2 = 1 + (-2) = (00000001) + (11111110) = (11111111) = ( -1 ) 正确。

00000000 表示0,10000000(0的反码:01111111加上1) 表示 -128

通过补码的运算,可以看出补码的设计目的是:

  • 使符号位能与有效值部分一起参加运算,从而简化运算规则。
  • 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
  • 此外,在补码中用-128(10000000)代替了-0,所以没有+0和-0之分,符合常理,所以补码的表示范围为: -128到127共256个。
  • 补码刚好是充分利用了byte的8bit空间。

结语

本文详细解读了Java整数(包括正数和负数)在计算机中的存储原理,并且以byte基本数据类型为例阐述了采用补码的形式存储数值的好处,希望大家看完本篇后能够弄清楚整数在计算机中的存储原理。

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

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

相关文章

server2019 sqlcmd命令安装_Ubuntu20.04LTS安装MS sql-server2019的方法

在本文中,我将向您展示如何在Ubuntu 20.04 Focal Fossa上安装Microsoft SQL Server。小广告:喜欢网络技术的朋友可以加W信:xfiles_sky一起学习进步。步骤一:更新ubuntu源sudo apt update && sudo apt upgrade步骤二&#…

servlet里面为什么有时候覆_为什么新来的经理强烈推荐?前后端分离知识,学到了...

引言前后端分离这个词相信大家都听过,不知道大家是怎么理解的呢。前阵子看项目的时候,有一段实现硬是没看懂,下面来给大家说一下一段愚蠢的经历哈。(我没正正式式写过前端,所以如果文章有错的地方希望可以在评论区友善交流~)一、交…

lamp 安装 mysql_linux lamp之离线安装mysql

Linux下自己创建目录/tigger上传mysql压缩包到此目录[rootlocalhost tigger]# tar zxvf mysql.tar.gz[rootlocalhost tigger]# cp -r mysql /usr/local/mysql/usr/local/mysql 为安装目录cd /usr/local/mysql[rootlocalhost mysql]# groupadd mysql[rootlocalhost mysql]# user…

microstation添加txt文件_C开发实战-文件操作

文件概述文件几乎无处不在,主要分为磁盘文件和设备文件,典型的磁盘文件有文本文件和二进制文件,磁盘文件存储在外部存储介质(例如磁盘,硬盘,U盘等等)需要加载到内存中才能使用。无论是文本文件还是二进制文件在计算机内…

怎样配置mysql数据源_mysql怎样配置ODBC数据源

选中 sqlserver选择默认连接的数据库 7、配置完成,可以测试连接 扩展资料: spring中配置数据源的几种常见方式:工具/原料 事先配置相应的环境mysql(mysql安装程序)mysql-connector-odbc-3.51.20-win32.exe(mysql数据源dobc安装程序) 步骤/方法…

python开发框架大全_最受欢迎 Top 12 Python 开源框架,你都用过吗?

作者 | 学Python的阿勇责编 | 夕颜出品 | CSDN博客今天给大家带来了12个在GitHub等开源网站中最受欢迎的Python开源框架。如果你正在学习python,那么这12个开源框架,千万别错过,这些框架包括事件I/O,OLAP,Web开发&…

python中的zip是什么意思_Python的zip()函数是什么

zip() 函数可以把两个列表“压缩”成一个 zip 对象(可迭代对象),这样就可以使用一个循环并行遍历两个列表。为了测试 zip() 函数的功能,我们可以先在交互式解释器中“试验”一下该函数的功能。>>> a [a,b,c]>>> b [1, 2, 3]>>…

python 子线程返回值_python-从线程返回值

python-从线程返回值我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级?12个解决方案59 votes我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它.puts将其结果作为参数接收…

python实现火车票查询_python实现12306火车票查询器

12306火车票购票软件大家都用过,怎么用Python写一个命令行的火车票查看器,要求在命令行敲一行命令来获得你想要的火车票信息,下面通过本文学习吧。Python火车票查询器接口设置先给这个小应用起个名字吧,既然及查询票务信息&#x…

python字符串用法_笔记:python字符串的使用

Python 没有表示单个字符的字符类型,只有字符串类型str。字符串是用单引号或双引号括起来的一系列字符。单引号表示的字符串中可以包含双引号字符,但不能直接包含单引号字符(否则无法知道字符串的开始和结尾分别在哪里)。同样,双引号表示的字…

new出来的对象怎么回收_JVM的内存模型及垃圾回收算法

1、什么是jvm:虚拟出来的计算机,是jre的一部分,使用jvm是为了支持与操作系统无关,实现跨平台,jvm内部体系结构主要分为三个部分:类加载器子系统,运行时数据区和执行引擎。2、jvm内存区域运行时数…

条令考试小程序辅助器_可以自己编题的答题软件,自定义题库考试出题工具,微信答题小程序...

自制题库自己编题的答题小程序要如何制作?今天给大家介绍下可以自己编题的答题软件,自制题库软件在微信小程序里自己出题,然后给别人来答题。每个人都可以通过这个小程序系统出考题,然后给到别人答题(自己、同事、学生…

python36 mysql_python-day36(初识MySQL数据库)

一. MySQL 介绍数据库分类:1. 关系型数据库(RDBMS)Oracle数据库MySQLl数据库MariaDB数据库SQL Server数据库Access数据库其他不常用关系型数据库: DB2,PostgreSQL,Informix,Sybase2. 非关系型数据库(Nosql)NOSQL>>>>> Not Olnly SQL键值(Key-Value)存储数据库me…

python解二元二次方程_寻找两个椭圆的交点(Python)

首先,您应该能够在一个方向上重新缩放椭圆。为此,需要将椭圆的系数计算为二次曲线,重新缩放,然后恢复椭圆的新几何参数:中心、轴、角度。然后你的问题减少到找到从椭圆到原点的距离。要解决最后一个问题,你…

mysql jion 三张_mysql三张表 left join

1.建表和数据学生表DROP TABLE IF EXISTS student;CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(30) DEFAULT NULL,classid varchar(30) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8;-- -------------------…

编写有效用例电子版_软件测试人员必须编写代码吗?

相信每一个刚入门软件测试的小伙伴都会琢磨一个问题:软件测试人员,要不要写代码?其实这个问题同样困扰着已经在测试行业闯荡了几年的测试小司机们。那今天,我就来给大家分析一下~01各种软件测试角色一般而言软件测试大体可以分为两…

mysql sqlserver firstrow=2_将CSV文件导入SQLServer

基于SQL Server的CSV导入1)CSV文件数据可能具有,(逗号)中间(Ex:Description),那么如何使导入处理这些数据?解如果你用,(逗号)作为分隔符,就无法区分数据中的逗号作为字段终止符和逗号。我会用不同的FIELDTERMINATOR喜欢||..代码看…

bert 中文 代码 谷歌_ELECTRA中文预训练模型开源,110个参数,性能媲美BERT

感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7050/ 在去年11月份,NLP大神Manning联合谷歌做的ELECTRA一经发布,迅速火爆整个NLP圈,其中ELECTRA-small模型参数量仅为 BERT-base模型的1/10,性能却依然能与BERT、RoBERTa等…

python开发系统架构设计师_系统架构设计师在线题库

该课程包含了三大重磅性课程,学员 可以分三个阶段进行学习,一步一个脚印深入巩固SpringBoot知识体系栈、消息中间件RabbitMQ以及分布式锁的实现方式1、SpringBoot实战知识体系~从菜鸟到小牛 本课程可以让学员一步一个脚印学习当前微服务SpringBoot项目开…

监督学习和无监督学习_机器学习的要素是什么? 有监督学习和无监督学习两大类...

如前所述,机器学习是AI的一个子集,通常分为两大类:有监督学习和无监督学习。监督学习教学AI系统的常用技术是通过使用大量带标签的示例来训练它们。这些机器学习系统被馈入大量数据,这些数据已被注释以突出显示感兴趣的功能。这些…