兩個16位有符號整數轉換為32位有符號整數的方法
阿新 • • 發佈:2018-12-29
在工作中遇到需要將兩個16位的有符號整數轉換為32位有符號整數的功能,具體情況是需要把PLC裡放在兩個D軟元件裡的32位資料以16位為單位讀到PC端後再轉換為32位資料。經過實踐,方法和注意事項整理如下:
先列出可用方法供大家參考,如有錯誤請指正!
第一種、通過BitConverter下的GetBytes()和ToInt32()方法來實現:
byte[] arrl, arrh, arrInt32; arrInt32 = new byte[4]; arrl = BitConverter.GetBytes(deviceValue_16[i]); arrh = BitConverter.GetBytes(deviceValue_16[i + 1]); arrInt32[0] = arrl[0]; arrInt32[1] = arrl[1]; arrInt32[2] = arrh[0]; arrInt32[3] = arrh[1]; int32Arr[j] = BitConverter.ToInt32(arrInt32, 0);
第二種、通過位操作來實現:
int dest;
short SourceA,SourceB;//A代表低位,B代表高位
dest |= (SourceB & 0x0000ffff);
dest = (dest << 16) | (SourceA & 0x0000ffff);
在網上看到過相關功能的其他實現方法,比如:
第一種:test[j] = (arrDeivceValue[i + 1] << 16) + arrDeivceValue[i];
第二種:test[j] = arrDeivceValue[i + 1] * 65536 + arrDeivceValue[i];
這兩種其實是一樣的原理,但是會有問題。問題表現為:當處理資料為負數並且低16位資料的符號位為1時會得出錯誤的結果,當低16位資料的符號位不為1時結果是正確的。
原因我認為是這兩種方法用的是加法運算導致的。因為把兩個數看成獨立的,那麼低16位資料的符號位根據值的不同可能為1可能為0,這樣進行加法運算時,若為低位為負數則結果變小,若低位為正數則結果變大。