最近有个项目涉及温度传输,两个字节表示,若为负值,则以补码形式上传上位机上位机解析显示,找了一大圈没发现有这个函数,于是自己写了一个,仅两个字节数据位有效。
//测试有效
#include "stdafx.h"
#include <iostream>
using namespace std;
/*****************************************************
1. 正数:
正数的原码、反码、补码都相同。
2. 负数:
原码:负数的绝对值,并且最高位为1。
反码:原码的符号位不变,其他位按位取反。
补码:在反码的基础上+1。
3. 移码:
无论是正/负数,都是在补码的基础上,符号位取反。
******************************************************/
//温度获取(补码计算) 公式 ~x = -(x+1)// 仅适用于两个字节可以表示的整数 范围-32768~32767
int ComplementCode(unsigned char* buf,int s,int e)
{
int f = ( buf[s] & 0x80) >> 7;//取符号位
if(f)//表示符号位为负
{
char d1 = ~buf[s]; //二进制取反
char d2 = ~buf[e];
int b = (d1<<8)&0xff00|d2&0xff; //得到~x的值
return -1-b; //返回负数值
}else
{
return (buf[s]<<8)&0xff00|buf[e]&0xff;
}
}
int main()
{
unsigned char data[8] = {0x01,0x00,0xfb,0xff,0x00,0x81,0x01,0x00};
int temp = -32768;
data[2] = (temp>>8)&0xff;
data[3] = temp&0xff;
int m = ComplementCode(data,2,3);
printf("%d",m);
getchar();
return 0;
}
运行结果: