两个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,这样进行加法运算时,若为低位为负数则结果变小,若低位为正数则结果变大。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值