[短文速读-1] a=a+b和a+=b的区别

前言

短文速读,这将是一个系列文章。自己写了很多文章,也看了很多文章。发现很多都是收藏不看系列。当然有时间的时候,的确会把收藏的文章找出来好好的学习一番。但是大多数文章仿佛石沉大海,失去了应有的价值。

所以萌生了这个系列的想法,系列文章的特点:以一些日常开发中不起眼的基础知识点为内核,围绕此包裹通俗易懂的文字。尽量用少思考的模式去讲述一个知识。让我们能够真正在碎片化的时间里学到东西!

出场角色

小A:刚踏入Java编程之路...

MDove:一个快吃不上饭的Android开发...

正题

小A:MDove,最近我有一个不成熟的小疑问,不知道当讲不当讲。

MDove:不成熟那就别问了...

小A:额错了,额真滴错了。额从一开始就不应该学Java...

MDove:问、问、问...

小A:a=a+b和a+=b。这俩者有什么区别呀?没看出来有什么区别啊!

MDove:你所说的没区别,是这样吧?

int a = 1;
int b = 2;
a = a + b;
a += b;

MDove:那你有没有换过别的写法呢?比如把b的类型变一下:

float b = 2F;

MDove:怎么样,看出来效果了吧。没看出来??OK,那我就贴上效果:

编译不能通过

MDove:这样就能看明白了吧?b提升了类型之后。会发现a = a + b是没办法编译通过的,需要强制类型转换才可以。但是我们的a + = b却可以,这是为什么呢?其实很简单。让我们反编译一下这个class文件,就可以很清晰的给出答案:

public void fun() { 
    int a = 1;
    float b = 2F;
    a += b;
}

// 反编译class的内容
public void fun() {
    byte var1 = 1;
    float var2 = 2.0F;        
    int var10000 = (int)((float)var1 + var2);
}

MDove:所以它们二者的区别就很清楚了吧?在这种a比b类型范围要小的情况下。a = a + b;需要强制类型转换,也就是我们常写的:a = (int) (a+b);而我们的a += b;被我们的编译器在编译期做了一些小手脚。也就是编译器帮我们进行了强制类型转化。

小A:原来是这样,那强制类型转换会带来什么问题呢?

MDove:解答这个问题,让我们先来看一张图:

image

MDove:强制类型转化,一般会带来精度丢失的问题。这里float的范围太大,我们就用byte和short来演示,强制类型带来的问题:

public void fun() {
    byte a = 1;
    short b = 127;
    a=(byte) (a+b);
    System.out.println(a);
}

MDove:System打出的内容,应该知道是什么吧?没错是-128。强制类型带来的问题一目了然了吧。

小A:怎么会是-128呢?

MDove:OK,接下来,我来解释一下,为什么会是-128这么一个奇怪的数字。首先,我们都知道基本类型在堆中所占的字节如下表。

小A:不对呀?我记得基本类型是存放在栈中的呀?

MDove:这种说法并不错,但不全面。存放在堆中还是在栈中,是取决于这个变量声明的位置。如果是局部变量,则会存放在栈帧中。但是如果是成员变量(全局变量),那么就会存放在堆中。此外存放在栈中,基本类型所占的字节是固定:如果是32位计算机那么就是4字节;64位便是8字节。

类型 所占字节
byte 1字节
short 2字节
int 4字节
long 8字节
char 2字节
float 4字节
double 8字节

MDove:解释完所占字节的问题,咱们继续。由上边可知byte占1字节,那么也就是8位,如果每一位都为1(11111111),那么理论上就是它所能表示的最大内容。

小A:那应该是255呀!

MDove:实际不然,因为正负的原因,计算机中使用补码的形式表示二进制,高1位表示符号位(0为正,1为负)。因此对于8位来说,最大只能是01111111,也就是127。(0表示它为正)

MDove:而我们刚才的那个计算byte a = 1; short b = 127; a=(byte) (a+b);不考虑类型转换,那么a+b妥妥的等于128。并且对于所占2字节的short来说那就是00000000 10000000。但是我们强制类型转化成了byte,这时做了一件事情,那就是高1字节的内容全部砍掉,也就是只剩下了10000000

MDove:按我们刚才所说,高1位的内容表示正负。1为负。

小A!!!如果1为负,那System.out应该是0才对啊

MDove:一看你二进制就没有好好学。对于含有补码形式的10000000,我们要用补码的方式去计算。计算套路如下:高1位为1,那么这是数就是负数。想要知道是负几,我们需要将10000000按位取反,也就是01111111。还没完,此时还要再加1,也就是10000000。现在得到的这个数是几,那么就是负几,10000000是十进制的128,因此补码形式的10000000也就是:-128。

MDove:这样解释是不是就知道强制类型转换带来的问题,以及为什么强制类型转化后的byte变成了-128了吧。

小A:好难学...我想回家种地...

小A妈:崽,别学编程啦,赶紧回家收玉米了。

剧终

这里是一帮应届生共同维护的公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油,一同努力

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

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,984评论 0 13
  • Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
    Java小辰阅读 1,109评论 0 2
  • 【记账本】今天发现的,从此记录每天的花费,采用复式记账法,记录消费在哪里,以及消费的钱从哪里来。 【买火车票】和1...
    lijp221阅读 423评论 0 0
  • 文 | 一夕一晓 在精油DIY的过程中,经常会涉及到精油稀释比例问题,比如将单方精油稀释到1%、3%、5%...
    一夕一晓阅读 4,515评论 0 3
  • 从什么时候开始呢?忘记了,只知道在初中的时候弄丢了我的第一部手机,借同学的手机给我妈打电话,说手机丢了,我妈就问我...
    墨锦夜阑慕思量阅读 170评论 0 0