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

问题描述 投票:-3回答:1

我有一种情况需要将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节),这可能是问题的一部分。

Update

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

  1. 获取一个代表操纵杆轴的无符号字符(255 =完全向前,0 =完全向后,中心= ~127 / 128 [文档没有具体说明它是什么])
  2. 使用ConvertSigned(n)将其转换为char
  3. 做一些数学计算电机速度(我已经取消了这一步骤进行测试)。
  4. 使用ConvertUnsigned(n)将其转换回电机的无符号字符(与操纵杆相同的范围,除了文档明确指出中心值为127)。
c unsigned signed mplab
1个回答
2
投票

我想你想要:

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

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

假设“127转换为0”是拼写错误。

© www.soinside.com 2019 - 2024. All rights reserved.