一文帮你读懂Java整数的存储原理

前言

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

整数的编码方式

image.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。

image.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基本数据类型为例阐述了采用补码的形式存储数值的好处,
希望大家看完本篇后能够弄清楚整数在计算机中的存储原理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可...
    yang2yang阅读 2,243评论 1 13
  • https://www.jianshu.com/p/55a8195291db本篇文章讲解了计算机的原码, 反码和补...
    PupilCHen阅读 1,191评论 1 48
  •  转自百度百科  计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位...
    SunnyMore阅读 1,773评论 0 1
  • 「WTF系列」深入Java中的位操作 关于WTF系列 引 学完本章节你将学会位的基础概念与语法,并且还会一些骚操作...
    qiujuer阅读 885评论 0 5
  • 桂月初三夜,秋凉白露生。幽幽客舍暖如春,罗衾锦衣横。 断续嘤咛娇喘,羞面玉肌香汗。可怜本是并蒂莲,余生不同眠。
    静月秋思叶落阅读 238评论 0 4