Конвертировать int[2] в long
У меня есть 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 ответа
У меня есть 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
явно разрешены псевдонимы других типов.
Если вы уверены, что у вас есть 32-разрядное целое и 64-разрядное, то вы можете использовать union
концепция.
union Convert
{
long i;
int j[2];
};
Проблема ширины может быть решена с помощью boost::uint64_t на обеих машинах.
http://www.boost.org/doc/libs/1_46_1/libs/integer/doc/html/boost_integer/cstdint.html