【问题标题】:How to convert unsigned to signed char (and back) while preserving range in C?如何在 C 中保留范围的同时将无符号转换为有符号字符(并返回)?
【发布时间】:2014-11-03 00:08:43
【问题描述】:

我遇到需要将无符号字符 (0-255) 转换为有符号字符 (-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 编译器那样自动将操作数提升为整数(请参阅the manual,第 2.7.1 节),这可能是问题的一部分。

更新

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

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

【问题讨论】:

  • 127 转换为 0?你确定吗?你不是说128?
  • @KerrekSB 我更新了这个问题来解决这个问题。我同意中心值为 127 似乎有点奇怪。不过,我认为 1 的差异对我来说并不重要。
  • 为什么所有的反对票?

标签: c unsigned signed mplab


【解决方案1】:

我想你想要:

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

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

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

【讨论】:

  • 这不是错字,但在我遇到的情况下并不重要。出于某种原因,文档说电机的中心(停止)值为 127。
  • 我以为我已经尝试过了......好吧,无论如何,它有效。
  • 如果有 256 个可能的状态,那么就没有确切的中心
猜你喜欢
  • 1970-01-01
  • 2013-01-22
  • 2011-04-19
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多