Math.abs(Integer.MIN_VALUE)問(wèn)題分析

日常刷題中季惩,然后有個(gè)地方是要求將當(dāng)前數(shù)變成絕對(duì)值才可以使用;然后開(kāi)開(kāi)心心寫(xiě)了如下代碼:

long a = Math.abs(Integer.MIN_VALUE);
System.out.println(a);

結(jié)果結(jié)果卻讓我大跌眼鏡腻格。但是一番分析下來(lái)倒是很有意思

運(yùn)行結(jié)果

點(diǎn)開(kāi)源碼(JDK1.8環(huán)境下)
源碼

這段話翻譯過(guò)來(lái)就是画拾,如果abs方法輸入?yún)?shù)為正數(shù),就返回那個(gè)值荒叶;如果未負(fù)數(shù)碾阁,就返回這個(gè)負(fù)數(shù)的對(duì)應(yīng)絕對(duì)值;但是如果輸入值為Integer.MIN_VALUE時(shí)些楣;就返回輸入值

這樣看起來(lái)問(wèn)題是解決了脂凶,但是身為一個(gè)合格的程序員,怎么可以不弄清楚原因呢愁茁。

1.原因分析

要講清上面發(fā)生的原因蚕钦,就必須把幾個(gè)核心的問(wèn)題都講清楚;

1.1 原碼

一開(kāi)始人們是通過(guò)原碼來(lái)表示整數(shù)鹅很,整數(shù)有正負(fù)之分嘶居,便通過(guò)符號(hào)位+二進(jìn)制的方式表示。(最高位(最左邊)取0表示正數(shù)促煮,取1表示負(fù)數(shù)邮屁。然后加上對(duì)應(yīng)的二進(jìn)制。

+1 = 0000 0001
-1 = 1000 0001

1.2 反碼

正數(shù)的反碼是其本身
負(fù)數(shù)的反碼是符號(hào)位不變 菠齿,其他位都變?yōu)榉?/p>

[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反

1.3 補(bǔ)碼

正數(shù)的補(bǔ)碼就是其本身
負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補(bǔ)
[-1] = [10000001]原 = [11111110]反 = [11111111]補(bǔ)

那么為何要使用補(bǔ)碼呢佑吝?

因?yàn)橛?jì)算機(jī)中沒(méi)有減法的概念,對(duì)應(yīng)減法 a-b = a+(-b);

舉個(gè)栗子

反碼的方式
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
1 - 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
補(bǔ)碼的方式
1 - 1 = 1 + (-1) = [0000 0001]補(bǔ) +[1111 1111]補(bǔ) = [0000 0000]補(bǔ)=0

所以這里如果1.8的jdk不限制绳匀,就容易導(dǎo)致結(jié)果錯(cuò)誤芋忿;可以理解為

MIN_VALUE[反] = 0x80000000 = 10....0(中間29個(gè)0)= 1......1(中間30個(gè)1)
MIN_VALUE[補(bǔ)] = 0x80000000 = 10....0(中間29個(gè)0) = 1......1(中間30個(gè)1)+1 = 0......0(中間30個(gè)1)

所以 這里錯(cuò)誤了;而且可以發(fā)現(xiàn)超出限制后疾棵,會(huì)形成一個(gè)循環(huán)

測(cè)試
結(jié)果

所以可以理解為為了防止這樣的循環(huán)發(fā)生戈钢,JDK1.8出現(xiàn)這個(gè)保護(hù)的模式;而一切的發(fā)生源頭就是補(bǔ)碼導(dǎo)致

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市是尔,隨后出現(xiàn)的幾起案子殉了,更是在濱河造成了極大的恐慌,老刑警劉巖嗜历,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣渗,死亡現(xiàn)場(chǎng)離奇詭異抖所,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)痕囱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)田轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鞍恢,你說(shuō)我怎么就攤上這事傻粘。” “怎么了帮掉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵弦悉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蟆炊,道長(zhǎng)稽莉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任涩搓,我火速辦了婚禮污秆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昧甘。我一直安慰自己良拼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布充边。 她就那樣靜靜地躺著庸推,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浇冰。 梳的紋絲不亂的頭發(fā)上贬媒,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音肘习,去河邊找鬼掖蛤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛井厌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播致讥,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仅仆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了垢袱?” 一聲冷哼從身側(cè)響起墓拜,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎请契,沒(méi)想到半個(gè)月后咳榜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體夏醉,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年涌韩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畔柔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臣樱,死狀恐怖靶擦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雇毫,我是刑警寧澤玄捕,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站棚放,受9級(jí)特大地震影響枚粘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飘蚯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一馍迄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孝冒,春花似錦柬姚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至穴店,卻和暖如春撕捍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泣洞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工忧风, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球凰。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓狮腿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呕诉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缘厢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容