Из того, что вы написали, у вас есть указатель 64, из которых только 40 битов являются указателями, и этот указатель указывает на некоторые данные размером 32 бита.
Ваш код, похоже, пытается исказить40-битный указатель в 32-битный указатель.
Что вы должны сделать, это добавить соответствующие 40 битов в 64-битный указатель, чтобы он оставался 64-битным указателем, а затем использовать его для доступа кданные, которые вы можете затем аналогичным образом и получить данные.В противном случае вы (как показывают ошибки) усекаете указатель.
Что-то вроде (у меня нет 64-битной версии, поэтому я не могу проверить это, но вы поняли):
address = address & 0x????????????????; // use the ?s to mask off the bits you
// want to ignore
value64 = *address; // value64 is 64 bits
value32 = (int)(value64 & 0x00000000ffffffff); // if the data is in the lower
// half of value64
or
value32 = (int)((value64 & 0xffffffff00000000) > 32); // if the data is in the
// higher half of value64
, где? Маскируют биты по мере необходимости (в зависимости от конечности, с которой вы работаете).
Возможно, вам также придется изменить (int) приведение типов в соответствии (вы хотитевместо этого приведите его к какому-либо 32-битному типу данных, который представляют данные, т.е. к типу значения 32).