自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

說說溢算那些事~!你的計算方式溢算了嗎?

移動開發(fā)
游戲快正式上線了,今天發(fā)現(xiàn)一個bug,讓人哭笑不得。數(shù)據(jù)計算溢出了;玩家充值的元寶變?yōu)榱?;這個可是一件大事,畢竟誰都擔(dān)不起這個責(zé)任??;

說說溢算那些事~!你的計算方式溢算了嗎?

游戲快正式上線了,今天發(fā)現(xiàn)一個bug,讓人哭笑不得。數(shù)據(jù)計算溢出了;玩家充值的元寶變?yōu)榱?;這個可是一件大事,畢竟誰都擔(dān)不起這個責(zé)任?。?/p>

來說說原因吧。開發(fā)語言是 java 工具是 netbeans ide 8.0.2

玩家對象有一個屬性是 gold 是int類型的;

玩家充值的時候計算方式如下.

 

  1.  int gold = 20000;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3.  
  4. if (Integer.MAX_VALUE >= gold + tempGold) { 
  5. gold = gold + tempGold; 
  6. else { 
  7. gold = Integer.MAX_VALUE; 
  8. }

看上去好像沒什么問題是吧。當(dāng)然以上是模擬的;

如果你經(jīng)驗豐富的話,或以下看出一些端倪,那就是會溢算的;

也許可能你看不出什么問題,我剛開始也沒發(fā)現(xiàn)什么問題,所以代碼就這么寫了,那好,我們來模擬一下
復(fù)制代碼

 

  1.  int gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. if (Integer.MAX_VALUE >= gold + tempGold) { 
  4. goldgold = gold + tempGold; 
  5. System.out.println("1"); 
  6. } else { 
  7. gold = Integer.MAX_VALUE; 
  8. System.out.println("2"); 

 

 

好大家猜一猜,這是會輸出什么結(jié)果????

也許你會回答輸出 2 對。沒錯我也以為會輸出 2 ,

可是運(yùn)行結(jié)果為什么是 1 呢?

首先我們分析一下,為什么我們以為會輸出 2 ?那么很明顯我們把

gold + tempGold

這兩個值的計算想當(dāng)然的以為會變成 long 型 而大于 Integer.MAX_VALUE

然而事實并非這樣,我來看看輸出結(jié)果
復(fù)制代碼

 

  1. nt gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. if (Integer.MAX_VALUE >= gold + tempGold) { 
  4. gold = gold + tempGold; 
  5. System.out.println("1"); 
  6. else { 
  7. gold = Integer.MAX_VALUE; 
  8. System.out.println("2"); 

 

 

  1. --- exec-maven-plugin:1.2.1:exec (default-cli) @ game-gamesr --- 
  2. 1 
  3. -2147445449 
  4. ------------------------------------------------------------------------ 
  5. BUILD SUCCESS 

 

在java的機(jī)制下 gold + tempGold 相加并非變成 long 型而是負(fù)數(shù)

看到這里,也許你會嘲笑我,好吧我承認(rèn),我確實沒有驗證過這個問題。好在游戲還沒有上線。測試發(fā)現(xiàn)問題。

不管這樣,現(xiàn)在我發(fā)現(xiàn)了這個問題,并且了解到了問題所在。好吧想辦法解決唄。

也就是把 int 轉(zhuǎn)變?yōu)?long 的問題
 

 

  1. int gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. long tempLGold = tempGold; 
  4. if (Integer.MAX_VALUE >= gold + tempLGold) { 
  5. gold = gold + tempGold; 
  6. System.out.println("1"); 
  7. else { 
  8. gold = Integer.MAX_VALUE; 
  9. System.out.println("2"); 
  10. System.out.println(gold + tempGold); 

 

測試一下現(xiàn)在的輸出結(jié)果呢?

 

  1. --- exec-maven-plugin:1.2.1:exec (default-cli) @ game-gamesr --- 
  2. 2 
  3. -2147463649 
  4. ------------------------------------------------------------------------ 
  5. BUILD SUCCESS 

這些正確了,,好吧。。犯二的事情結(jié)束了??墒前l(fā)現(xiàn)這里多了一個變量 long tempLGold;屬性和操作不是很方便,還有沒有更好的操作;

  1. nt gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. if (Integer.MAX_VALUE >= gold + tempGold + 0L) { 
  4. gold = gold + tempGold; 
  5. System.out.println("1"); 
  6. else { 
  7. gold = Integer.MAX_VALUE; 
  8. System.out.println("2"); 

注意后面那個0L

看看輸出

 

  1. --- exec-maven-plugin:1.2.1:exec (default-cli) @ game-gamesr --- 
  2. ------------------------------------------------------------------------ 
  3. BUILD SUCCESS 

結(jié)果還是輸出1,也許你會嘲笑我有范二了,對我確實犯二 了,,深究才知道 運(yùn)算符優(yōu)先級問題。

那好吧再改改
 

 

  1. int gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. if (Integer.MAX_VALUE >= 0L + gold + tempGold) { 
  4. gold = gold + tempGold; 
  5. System.out.println("1"); 
  6. else { 
  7. gold = Integer.MAX_VALUE; 
  8. System.out.println("2"); 

輸出

 

  1. --- exec-maven-plugin:1.2.1:exec (default-cli) @ game-gamesr --- 
  2. 2 
  3. ------------------------------------------------------------------------ 
  4. BUILD SUCCESS 

還可以

  1. int gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. if (Integer.MAX_VALUE >= gold + tempGold * 1L) { 
  4. gold = gold + tempGold; 
  5. System.out.println("1"); 
  6. else { 
  7. gold = Integer.MAX_VALUE; 
  8. System.out.println("2"); 
  1. nt gold = Integer.MAX_VALUE - 1800;//玩家原有的 
  2. int tempGold = 20000;//玩家現(xiàn)在充值的 
  3. if (Integer.MAX_VALUE >= gold + tempGold * 1L) { 
  4. gold = gold + tempGold; 
  5. System.out.println("1"); 
  6. else { 
  7. gold = Integer.MAX_VALUE; 
  8. System.out.println("2"); 
  9. }

 

  1. --- exec-maven-plugin:1.2.1:exec (default-cli) @ game-gamesr --- 
  2. 2 
  3. ------------------------------------------------------------------------ 
  4. BUILD SUCCESS 

這下正確的了,,,

 

失足程序員的犯二事情啊。。。

責(zé)任編輯:chenqingxiang 來源: 博客園
相關(guān)推薦

2022-07-19 13:31:18

Buddy算法內(nèi)存管理框架

2009-07-29 10:36:04

北電收購

2024-04-03 09:50:33

MySQLMDL事務(wù)

2015-07-06 11:35:07

預(yù)裝軟件

2012-11-12 15:19:52

溢信科技內(nèi)網(wǎng)安全

2015-06-19 13:54:49

2016-05-19 18:33:31

百合網(wǎng)云計算婚戀

2010-11-30 14:22:11

溢信科技

2017-01-19 20:37:58

office word漏洞下溢

2012-07-25 09:56:16

虛擬化

2015-07-23 09:30:43

爛代碼程序員

2018-09-27 05:31:14

2011-10-19 19:07:30

溢信科技安全服務(wù)

2011-09-05 17:18:28

2017-11-03 13:43:24

云計算Saas信息化

2010-08-09 13:20:36

Flex

2018-01-04 13:29:13

租房租房網(wǎng)站安全

2010-12-23 15:48:28

內(nèi)網(wǎng)安全

2010-09-15 14:59:32

內(nèi)網(wǎng)安全溢信科技首屆渠道高峰論壇

2011-04-14 14:23:06

軟件測試測試
點贊
收藏

51CTO技術(shù)棧公眾號