Как мне обработать «приведение из« void * »к« int »теряет точность» при компиляции 32-битного кода на 64-битной машине? - PullRequest
31 голосов
/ 08 января 2010

У меня есть пакет, который компилируется и отлично работает на 32-битной машине. Я сейчас пытаюсь заставить его скомпилировать на 64-битной машине и найти следующую ошибку-

 error: cast from ‘void*’ to ‘int’ loses precision

Есть ли флаг компилятора для подавления этих ошибок? или мне нужно вручную редактировать эти файлы, чтобы избежать этих бросков?

Ответы [ 12 ]

1 голос
/ 09 июля 2014

Иногда целесообразно разделить 64-битный элемент на 2 32-битных элемента. Вот как бы вы это сделали:

Заголовочный файл:

//You only need this if you haven't got a definition of UInt32 from somewhere else
typedef unsigned int UInt32;

//x, when cast, points to the lower 32 bits
#define LO_32(x) (*( (UInt32 *) &x))

//address like an array to get to the higher bits (which are in position 1)
#define HI_32(x) (*( ( (UInt32 *) &x) + 1)) 

Исходный файл:

//Wherever your pointer points to
void *ptr = PTR_LOCATION 

//32-bit UInt containing the upper bits
UInt32 upper_half = HI_32(ptr); 

//32-bit UInt containing the lower bits
UInt32 lower_half = LO_32(ptr); 
1 голос
/ 04 марта 2013

Я столкнулся с подобной проблемой. Я решил это следующим образом:

 #ifdef 64BIT
 typedef uint64_t tulong;
 #else
 typedef uint32_t tulong;
 #endif

 void * ptr = NULL; //Whatever you want to keep it.
 int  i;
 i = (int)(tulong)ptr;

Я думаю, проблема заключается в том, чтобы указывать тип на более короткий тип данных. Но для более крупного типа до int он отлично работает.

Я преобразовал эту проблему с типизирования указателя на long до типирования 64-разрядного целого числа в 32-разрядное целое число, и оно работало нормально. Я все еще в поиске опции компилятора в GCC / Clang.

...