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