如何在保留C范围的同时将unsigned转换为signed char(和back)?

时间:2014-11-03 00:08:44

标签: c unsigned signed mplab

我有一种情况需要将unsigned char(0-255)转换为signed char(-128-127)。我想将0转换为-128,127转换为0和255转换为127。

我目前正在使用此代码执行此操作(即使它不会完全保留范围):

unsigned char ConvertUnsigned(char n) {
    return n + 127;
}

char ConvertSigned(unsigned char n) {
    return n - 127;
}

此代码似乎占用了所有值并将它们转换为255,但我无法验证这一点(见下文)。

我正在使用MPLAB C18编译器为Vex PIC单片机(具有Microchip PICmicro PIC18F8520)编写此代码。我不知道代码实际上在做什么,因为我没有调试器或任何其他方式与芯片上的代码进行通信。

编译器仅支持C89,并且不会像普通的C编译器那样自动将操作数提升为int(参见the manual,第2.7.1节),这可能是问题的一部分。

更新

我写的应用程序基本上是这样的:

  1. 获取表示操纵杆轴的无符号字符(255 =完全向前,0 =完全向后,中心= ~127 / 128 [文档未说明具体内容])
  2. 使用ConvertSigned(n)
  3. 将其转换为字符
  4. 做一些数学计算电机速度(我已经取消了这个测试步骤)。
  5. 使用ConvertUnsigned(n)将其转换回电机的无符号字符(与操纵杆相同的范围,但文档明确指出中心值为127)。

1 个答案:

答案 0 :(得分:2)

我想你想要:

unsigned char ConvertUnsigned(char n) {
    return (int)n + 128;
}

char ConvertSigned(unsigned char n) {
    return (int)n - 128;
}

假设“127转换为0”是一个错字。