在计算机系统中,整形数据一律用补码来存储,其原因在于,使用补码可以将符号位和数据位统一处理,与此同时,加法和减法也可以统一处理。
1)正数的原码、反码和补码相同;
2)负数的反码:原码的符号位不变,数据位按位取反;
3)负数的补码:反码+1(如果+1后要进位,要一直往前进位,包括符号位)。
在DSP中的测试代码如下:
uint16_t test1 = 10;
int16_t test2 = -10;
uint16_t test3 = 65000;
test1 = (uint16_t)test2;
test2 = (int16_t)test3;
测试结果如下:
分析:
10、-10以及6500三个数在计算机存储单元里的存储格式如下表所示,从该表不难看出,将-10强制转换为uint16_t格式后,转换后的数据应为65526,与上述测试结果一致。同理,将65000强制转换为int16_t格式后,转换后的数据应为-536,与测试结果一致。
总之,不同类型的整形数据之间的强制转换归根到底就是一条:按存储单元中的存储格式直接传送。因而,对于交流信号,负数通过Modbus通信传送给上位机显示时,在DSP中可以先强制转换为uint16_t格式,然后上位机程序再强制转换为int16_t格式即可。