有没有办法在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位整数类型。 byte
与unsigned char
相同。
NXC是'Not eXactly C',是C的亲戚,但与C明显不同。
答案 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)
问题最初标记为c;此答案可能不适用于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/
的思维局论坛