Отдельный int в байтах в NXC - PullRequest
2 голосов
/ 25 апреля 2011

Есть ли способ преобразовать целое число со знаком в массив байтов в 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-разрядный целочисленный тип со знаком.byte - это то же самое, что и unsigned char.


NXC - это 'Не совсем C' , родственник C, но отчетливо отличается от C.

Ответы [ 3 ]

4 голосов
/ 25 апреля 2011

Как насчет

    unsigned char b[4];

    b[0] = (x & 0xFF000000) >> 24;
    b[1] = (x & 0x00FF0000) >> 16;
    b[2] = (x & 0x0000FF00) >> 8;
    b[3] = x & 0xFF;
2 голосов
/ 25 апреля 2011

Лучший способ сделать это в NXC с помощью кодов операций, доступных в базовой ВМ, - это использовать FlattenVar для преобразования любого типа в строку (или байтовый массив с добавленным нулем в конце). Это приводит к одной операции кода операции виртуальной машины, где любой из перечисленных выше параметров, использующих сдвиги и логические 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 - это на форумах Mindboards по адресу http://forums.mindboards.net/

2 голосов
/ 25 апреля 2011

Вопрос изначально помечен ; этот ответ может быть неприменим к не совсем 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;

Вы можете рассматривать это как развернутую петлю. Сдвиг на ноль может быть опущен; Оптимизатор, безусловно, сделает это. Несмотря на то, что результат смещения вправо отрицательного значения не определен, проблем нет, поскольку этот код получает доступ только к битам, в которых определено поведение.

Этот код дает байты в порядке с прямым порядком байтов - младший байт находится в 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;
...