在NXC中将signed int分隔为字节

时间:2011-04-25 05:47:57

标签: nxt nxc

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

我试过了:

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

    id.idx++;
}

但它失败了。

编辑:这有效...它只是没有下载。我浪费了大约一个小时试图搞清楚。 &GT; _&GT;


编辑:在NXC中,>>是算术移位。 int是带符号的16位整数类型。 byteunsigned char相同。


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

3 个答案:

答案 0 :(得分:4)

怎么样

    unsigned char b[4];

    b[0] = (x & 0xFF000000) >> 24;
    b[1] = (x & 0x00FF0000) >> 16;
    b[2] = (x & 0x0000FF00) >> 8;
    b[3] = x & 0xFF;

答案 1 :(得分: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;

答案 2 :(得分:2)

使用底层VM中可用的操作码在NXC中执行此操作的最佳方法是使用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以及非eXactly C帮助的最佳方式是通过http://forums.mindboards.net/

的思维局论坛