1. 程式人生 > >兩個16位有符號整數轉換為32位有符號整數的方法

兩個16位有符號整數轉換為32位有符號整數的方法

在工作中遇到需要將兩個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,這樣進行加法運算時,若為低位為負數則結果變小,若低位為正數則結果變大。