偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

來說說原因吧。開發(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. }

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

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

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

 

  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"); 

 

 

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

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

可是運行結果為什么是 1 呢?

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

gold + tempGold

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

然而事實并非這樣,我來看看輸出結果
復制代碼

 

  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的機制下 gold + tempGold 相加并非變成 long 型而是負數(shù)

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

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

也就是把 int 轉變?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)在的輸出結果呢?

 

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

這些正確了,,好吧。。犯二的事情結束了??墒前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 

結果還是輸出1,也許你會嘲笑我有范二了,對我確實犯二 了,,深究才知道 運算符優(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 

這下正確的了,,,

 

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

責任編輯:chenqingxiang 來源: 博客園
相關推薦

2022-07-19 13:31:18

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

2009-07-29 10:36:04

北電收購

2024-04-03 09:50:33

MySQLMDL事務

2015-07-06 11:35:07

預裝軟件

2012-11-12 15:19:52

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

2015-06-19 13:54:49

2015-07-23 09:30:43

爛代碼程序員

2016-05-19 18:33:31

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

2010-11-30 14:22:11

溢信科技

2018-09-27 05:31:14

2010-08-09 13:20:36

Flex

2018-01-04 13:29:13

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

2011-09-05 17:18:28

2012-07-25 09:56:16

虛擬化

2017-01-19 20:37:58

office word漏洞下溢

2017-11-03 13:43:24

云計算Saas信息化

2011-04-14 14:23:06

軟件測試測試

2024-09-29 08:47:55

2024-02-21 07:24:21

微服務單體架構MVC

2011-10-19 19:07:30

溢信科技安全服務
點贊
收藏

51CTO技術棧公眾號