posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Java Puzzler - 數值處理中容易犯的錯誤

          Posted on 2007-11-10 21:32 ZelluX 閱讀(789) 評論(0)  編輯  收藏 所屬分類: OOP
          Pitfall 1:判斷x的奇偶性
          public static boolean isOdd(int x) {
              
          return x % 2 == 1;
          }
          當x為負奇數時,x % 2的值為負數。
          Note:把 x % 2 == 1 改為 x % 2 != 0

          Pitfall 2:長整數計算
          long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
          這個表達式先計算左邊幾個int的乘積,然后再把值轉換為long,因此仍會溢出
          Note:把24改成24L

          Pitfall 3:看看這句話的結果
          System.out.println(12345+5432l);
          Note:5432后面的l很容易被看成1,因此建議使用L表示長整形時都使用大寫。

          Pitfall 4:下面這句話又會是什么結果
          System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
          Java計算時先用sign-extension把后面一個數轉成long,然后再計算
          Note:盡量避免混合類型計算

          Pitfall 5:這句話呢?
          System.out.println((int) (char) (byte) -1);
          結果是65535
          Note:char是無符號類型,將char轉為int時使用zero-extension

          Pitfall 6:交換變量值
          int x = 1984;
          int y = 2001;
          x ^= y ^= x ^= y;
          最終結果是x == 0, y == 1984
          Note:Java中操作符是從左往右計算的 (JLS 15.7)
          改成 y = (x ^ (y ^= x) ^ y; 就可以,但是永遠不要這么做 
           
          Pitfall 7:問號操作符
          char x = 'X';
          int i = 0;
          System.out.print(true ? x : 0);
          System.out.print(false ? i : x);
          輸出結果為X88
          Note:同樣是混合類型計算導致的問題,建議在條件表達式中使用類型相同的第二和第三操作符。
           
          Pitfall 8:看似相同的表達式的不同結果
          short x = 0;
          int i = 123456;
          1) x += i; // 隱含了類型轉換,結果為-7616
          2) x = x + i; // 編譯無法通過,因為損失了精度 
           
          主站蜘蛛池模板: 玉田县| 郁南县| 伊川县| 德惠市| 韶关市| 扎赉特旗| 红安县| 阳朔县| 潼南县| 左贡县| 平利县| 五家渠市| 明溪县| 靖江市| 望都县| 阿克苏市| 叙永县| 潍坊市| 九寨沟县| 夹江县| 甘南县| 凤庆县| 延寿县| 巴里| 嘉鱼县| 视频| 射阳县| 海口市| 镇雄县| 青神县| 福海县| 石嘴山市| 塘沽区| 临洮县| 肃北| 九龙县| 安岳县| 石狮市| 普陀区| 深州市| 府谷县|