在计算机中数值都是以二进制的形式进行存储好计算的。有符号数就是最高位的1代表符号,最高位为1代表为负数,最高位为0代表正数。
原码:正数的原码是其本身,负数的原码是其绝对值加上符号位,例如8位二进制:
1的原码=0000 0001,-1的原码=1000 0001;
反码:正数的反码和原码相同,负数的反码是符号位不变其他位取反,例如8位二进制:
1的反码=0000 0001, -1的反码=1111 1110;
补码:正数的补码是其本身,负数的补码是其反码加1,例如8位二进制:
1的补码=0000 1111, -1的补码=1111 1111;
计算机中存储数据时是存储的补码。
1android屏发送-2给单片机
如果把-2存入单片机中需要将其转换成16进制有符号数进行存储,首先将-2转换成补码
-2的补码=1111 1111 1111 1110;
android屏无法直接把-2发送给单片机,需要将-2转化成补码发送给单片机
-2是int类型的32位
方法是;-2&0xFFFF.就可以了,有符号数&无符号数结果是-2的补码换算成16进制位65534.这样就可以直接发送-2&0xFFFF直接发送给单片机了。
-2&0xFFFF只保留了低16位把高16位去掉。
2android屏读取单片机中有符号数65534显示为-2
把-2的补码转化成源码:减一取反 -(~(65534-1)&0xFFFF ) 结果为-2.
需要对最高位进行判断是否有符号:
读取的单片机数据为result显示成无符号位
int reInt = Integer.valueOf(result);
if ((reInt & 32768) == 32768) {
// tyy 存在符号位
-(~(reInt-1)&0xFFFF )
} else {//tyy 不存在符号位}
这就是我的总结,详细了解原码 反码 补码参考 http://blog.csdn.net/daiyutage/article/details/8575248