我正在使用一些嵌入式硬件,一个使用Dynamic C 9的Rabbit SBC.
我正在使用微控制器使用其中一个串行端口从数字罗盘传感器读取信息.
传感器使用单个带符号字节将值发送到微控制器. (-85到85)
当我收到这些数据时,我将它放入一个char变量中
这适用于正值,但是当传感器开始发送负值时,读数会跳到255,然后再回到0.我认为这是因为最后一位用于确定负值/正值,并且正在扭曲真正的价值观.
我的初衷是将我的数据类型更改为已签名的字符.
但是,我遇到的问题是我使用的微控制器上的Dynamic C版本本身不支持带符号的char值,只有unsigned.
我想知道是否有办法手动将我收到的数据转换为有符号值?
解决方法
您只需要提取参考书并阅读控制器如何表示负数.其余的只是打字.
例如,两个补码通过取值mod 256来表示,因此您只需要通过模数进行调整.
int signed_from_unsignedchar(unsigned char c) { int result = c; if (result >= 128) result -= 256; return result; }
One’s complement更简单:你只需翻转位.
int signed_from_unsignedchar(unsigned char c) { int result = c; if (result >= 128) result = -(int)(unsigned char)~c; return result; }
通过设置高位,符号幅度表示负数,因此您只需要清除该位并否定:
int signed_from_unsignedchar(unsigned char c) { int result = c; if (result >= 128) result = -(result & 0x7F); return result; }