64-битные адреса

Я компилирую приложение для 64-битной операционной системы Windows. Приложение должно сохранять 64-битные адреса, я должен выбрать тип переменной, чтобы сохранить их. Думал долго их спасать. Но sizeof(long) == 4.Где и как сохранить адреса


person Yakov    schedule 11.12.2011    source источник
comment
Что вы имеете в виду под словом сохранить? Вы имеете в виду, что хотите записать адреса в файл?   -  person Oliver Charlesworth    schedule 11.12.2011
comment
Откуда вы берете адреса? Адреса хранятся в указателях.   -  person Oliver Charlesworth    schedule 11.12.2011
comment
Да, используйте указатель. Компилятор выберет размер указателя в зависимости от режима компиляции.   -  person Hot Licks    schedule 11.12.2011
comment
Не существует языка с названием C/C++   -  person Gunther Piez    schedule 11.12.2011


Ответы (5)


Вы должны хранить адреса памяти в указателях:

void *myaddr = 0x0123456789ABCDEF; // memory address
int *myaddr2 = 0x0123456789ABCDEF; // pointer to int in memory, dereferencable

Вы можете получить адрес переменной следующим образом:

int myvar;
int *addrofmyvar = &myvar;
printf("%p", addrofmyvar); // use %p to print pointers

Примечание: существуют некоторые различия между C и C++ в отношении указателей (особенно указателей void). См. стандарты C и C++. Нет такой вещи, как "С/С++".

person Community    schedule 11.12.2011

Если вы собираетесь хранить указатель как число, используйте uintptr_t или intptr_t. Они гарантированно соответствуют размеру и представлению указателя.

В противном случае вы не пишете переносимый код.

person Blagovest Buyukliev    schedule 11.12.2011

Вы должны использовать фактические указатели (на любой тип в адресе) для хранения адресов.

person SLaks    schedule 11.12.2011

Я не пробовал, но, возможно, с длинным долгом будет работать.

Пожалуйста, проверьте эту ссылку: http://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.80%29.aspx

unsigned long long, 8 байт, эквивалентно unsigned __int64

диапазон: от 0 до 18 446 744 073 709 551 615

person Jonathan    schedule 11.12.2011
comment
+1, чтобы противостоять минусующим. Это строго правильно (или, по крайней мере, так же правильно, как и другие ответы) - person rubenvb; 11.12.2011

Не используйте LONG или LONG LONG при написании кроссплатформенного кода. LONG не имеет одинакового размера на разных платформах/разных компиляторах.

person user2224686    schedule 29.03.2013