2

有什么方法可以将有符号整数转换为 NXC 中的字节数组?由于语言限制,我也不能使用显式类型转换或指针。

我试过了:

for(unsigned long i = 1; i <= 2; i++)
{
    MM_mem[id.idx] = ((val & (0xFF << ((2 - i) * 8)))) >> ((2 - i) * 8));

    id.idx++;
}

但它失败了。

编辑:这工作......它只是没有下载。我浪费了大约一个小时试图弄清楚。>_>


编辑:在 NXC 中,>>是算术移位。int是有符号的 16 位整数类型。Abyte和 是一样的unsigned char


NXC 是“Not eXactly C”,是 C 的亲戚,但与 C 明显不同。

4

3 回答 3

4

怎么样

    unsigned char b[4];

    b[0] = (x & 0xFF000000) >> 24;
    b[1] = (x & 0x00FF0000) >> 16;
    b[2] = (x & 0x0000FF00) >> 8;
    b[3] = x & 0xFF;
于 2011-04-25T05:56:55.963 回答
2

最初标记为的问题;此答案可能不适用于 Not eXactly C。

这有什么问题:

int value;
char bytes[sizeof(int)];

bytes[0] = (value >>  0) & 0xFF;
bytes[1] = (value >>  8) & 0xFF;
bytes[2] = (value >> 16) & 0xFF;
bytes[3] = (value >> 24) & 0xFF;

您可以将其视为展开的循环。零移位可以省略;优化器肯定会这样做。即使未定义右移负值的结果,也没有问题,因为此代码仅访问定义行为的位。

此代码以 little-endian 顺序给出字节 - 最低有效字节位于bytes[0]. 显然,大端顺序是通过以下方式实现的:

int value;
char bytes[sizeof(int)];

bytes[3] = (value >>  0) & 0xFF;
bytes[2] = (value >>  8) & 0xFF;
bytes[1] = (value >> 16) & 0xFF;
bytes[0] = (value >> 24) & 0xFF;
于 2011-04-25T05:57:15.537 回答
2

在 NXC 中使用底层 VM 中可用的操作码执行此操作的最佳方法是使用 FlattenVar 将任何类型转换为字符串(也就是在末尾添加 null 的字节数组)。它导致单个 VM 操作码操作,其中使用移位和逻辑 AND 和数组操作的任何上述选项都需要数十行汇编语言。

task main()
{
  int x = Random(); // 16 bit random number - could be negative
  string data;
  data = FlattenVar(x); // convert type to byte array with trailing null
  NumOut(0, LCD_LINE1, x);
  for (int i=0; i < ArrayLen(data)-1; i++)
  {
#ifdef __ENHANCED_FIRMWARE
    TextOut(0, LCD_LINE2-8*i, FormatNum("0x%2.2x", data[i]));
#else
    NumOut(0, LCD_LINE2-8*i, data[i]);
#endif
  }
  Wait(SEC_4);
}

获得 LEGO MINDSTORMS 和 NXT 和 Not eXactly C 帮助的最佳方式是通过位于http://forums.mindboards.net/的思维板论坛

于 2011-04-25T15:37:54.510 回答