конвертировать int [2] в long - PullRequest
       19

конвертировать int [2] в long

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

У меня есть int [2] представление long int на 32-битной машине и я хочу преобразовать его в long на 64-битной машине. существует ли безопасный независимый от архитектуры способ сделать это преобразование?

Исходный компьютер 32-битный, а int 32-битный. Машина назначения 64-битная, а тип long long определенно 64-битный.

я могу сделать следующее?

long i;
int j[2];
#ifdef LITTLEENDIAN
j[1] = *(int*)(&i);
j[0] = *(((int*)(&i))+1)
#else
j[0] = *(int*)(&i);
j[1] = *(((int*)(&i))+1)
#endif

Если вышеупомянутое неверно, то каков лучший и самый безопасный способ для этого? Я уверен, что об этом бы спросили ранее, но я не нашел точного ответа.

Спасибо

Ответы [ 3 ]

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

У меня есть int [2] представление long int в 32-битной машине и я хочу преобразовать его в long на 64-битной машине.есть ли безопасный архитектурно-независимый способ сделать это преобразование?

Не совсем.Потому что помимо порядка байтов, размеры двух типов данных также могут различаться.На некоторых популярных платформах int и long имеют одинаковый размер (оба 32 бита)

В конечном счете, это зависит от того, как вы создали представление int[2].Что бы вы ни делали для создания этого массива int, нужно обратить его вспять, чтобы получить из него действительный long.

Один подход, который будет работать на практике (но, с технической точки зрения, неопределенное поведение), должен поместить оба в объединение:

union {
  int i2[2];
  long l;
} u;

Теперь вы можете просто написать в u.i2 и прочитать из u.l.Стандарт C ++ технически не допускает этого (это неопределенное поведение), но это настолько распространенная уловка, что основные компиляторы в любом случае явно его поддерживают.

Однако лучшим подходом может быть использование char[]вместо int[], потому что char явно разрешено использовать псевдонимы других типов.

1 голос
/ 26 апреля 2011

Если вы уверены, что у вас есть 32-разрядное целое и 64-разрядное, то вы можете использовать union концепт.

union Convert
{
  long i;
  int j[2];
};
0 голосов
/ 26 апреля 2011

Проблема ширины может быть решена с помощью boost :: uint64_t на обеих машинах.

http://www.boost.org/doc/libs/1_46_1/libs/integer/doc/html/boost_integer/cstdint.html#boost_integer.cstdint.exact_width_integer_types

...