由于byte的表示范圍是-128127,如果使用下面方法轉(zhuǎn)換將會(huì)發(fā)生致命的錯(cuò)誤:

          int num = 40000;

          byte first = num/256;

          byte second = num%256;

          這樣,只要firstsecond超過(guò)127,就會(huì)溢出,從而合并起來(lái)的int數(shù)值會(huì)和原數(shù)值不一致。

           

          int input2 = 130;

          byte a3 = (byte) input2;

          input2 = a3;

          System.out.println(input2);

          對(duì)于上述代碼,結(jié)果為-126,而不是開始的130,也是溢出的問(wèn)題,所以一定要注意。

           

          解決方法:

          第一種:較為不徹底,對(duì)于正整數(shù)來(lái)說(shuō),可以除以127,從而使byte不會(huì)溢出

          第二種:轉(zhuǎn)化的時(shí)候按位操作,從而不使用強(qiáng)制轉(zhuǎn)化損失精度:

          // iSource轉(zhuǎn)為長(zhǎng)度為iArrayLenbyte數(shù)組,字節(jié)數(shù)組的低位是整型的低字節(jié)位

          public static byte[] toByteArray(int iSource, int iArrayLen)

           {

                   byte[] bLocalArr = new byte[iArrayLen];

                   for ( int i = 0; (i < 4) && (i < iArrayLen); i++)

                   {

                             bLocalArr[i] = (byte)( iSource>>8*i & 0xFF );

                   }

                   return bLocalArr;

          }  

          // byte數(shù)組bRefArr轉(zhuǎn)為一個(gè)整數(shù),字節(jié)數(shù)組的低位是整型的低字節(jié)位

          public static int toInt(byte[] bRefArr)

           {

                   int iOutcome = 0;

                   byte bLoop;

                  

                   for ( int i =0; i<4 ; i++)

                   {

                             bLoop = bRefArr[i];

                             iOutcome+= (bLoop & 0xFF) << (8 * i);

                   }

                   return iOutcome;

          }

          Feedback

          # re: int型數(shù)據(jù)轉(zhuǎn)成byte數(shù)據(jù)時(shí)出現(xiàn)的問(wèn)題  回復(fù)  更多評(píng)論   

          2008-08-06 12:40 by stonebow
          這里面有個(gè)問(wèn)題,就是bLoop & 0xFF的作用,如果不加的話結(jié)果會(huì)出錯(cuò)。因?yàn)閎yte轉(zhuǎn)化為int的時(shí)候是按值相等傳遞,所以byte值為10000001的時(shí)候,對(duì)應(yīng)的int為1111111111111…111110000001,這樣就會(huì)出現(xiàn)問(wèn)題,這時(shí)候&0xFF就會(huì)只保留最后實(shí)際的8位了。

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 英超| 曲沃县| 宁都县| 锡林郭勒盟| 历史| 海盐县| 台中市| 海宁市| 杂多县| 梅河口市| 长武县| 阜新| 赞皇县| 辽源市| 金乡县| 太和县| 长兴县| 漳浦县| 泗水县| 莱阳市| 诸暨市| 沙河市| 平乡县| 吉木萨尔县| 诏安县| 莫力| 资兴市| 郎溪县| 拜城县| 双江| 慈利县| 中宁县| 吉安市| 台江县| 东港市| 桐庐县| 桂林市| 策勒县| 伊金霍洛旗| 衡阳县| 麻江县|