Получить целое число из адреса в шестнадцатеричном формате, используя метод, отличный от reinterpret_cast - PullRequest
0 голосов
/ 16 февраля 2020

Я хочу преобразовать шестнадцатеричный адрес в целое число. Я просмотрел stackoverflow, и кто-то посоветовал использовать reinterpret_cast для этой цели. Вот мой код.

class sample
{
    public:
        int x;
        sample *next;
        sample()
        {
            x=0;
        }
};

int main()
{
    sample *objptr = new sample();
    long int x = reinterpret_cast<long int&>(objptr);
    cout<<x<<" "<<objptr;
    return 0;
}

Есть ли другой способ добиться того же? Что, если у меня есть восьмеричное представление для того же самого? Как преобразовать шестнадцатеричные и восьмеричные в целые и наоборот в C ++?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

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

Адреса не являются шестнадцатеричными, десятичными, восьмеричными, двоичными или чем-либо еще.

У вас нет «шестнадцатеричного адреса» или «восьмеричного представления» для того же самого, всегда.

Адреса - это адреса.

Даже если бы они были концептуально одинаковыми с числами, они все равно не были бы шестнадцатеричными или десятичными или восьмеричное, или двоичное, или что-нибудь еще, потому что это base , используемые, когда представляет числа, то есть выводит их на экран. Они не являются свойством числа; они не являются частью его значения или типа.

Числа являются числами.

С этим, что вам нужно сделать, это получить число с адреса, затем напечатайте это число в желаемом вами представлении.

Первое просто: приведите его к std::uintptr_t в C ++ 11 (или просто uintptr_t в C99). Вам не нужно , нужно , чтобы использовать reinterpret_cast для этого; вместо этого вы можете использовать приведение в стиле C. Но вам нужно сыграть. Затем выведите его так, как вам нравится, так же, как вы вывели бы любое другое число, на любую базу, какую пожелаете.

По иронии судьбы, возможно, поэтому вы думаете, что эти вещи "шестнадцатеричные" или "восьмеричные", потому что единственный способ вы можете когда-нибудь увидеть их на экране, когда кто-то сделал эти шаги для вас.

0 голосов
/ 16 февраля 2020

Как то так?

int main(int argc, char** argv)
{
  // this is your object
  int* i = new int(0);

  // as stated by walnut
  auto addr = reinterpret_cast<std::uintptr_t>(i);

  std::cout << std::dec << addr << std::endl;
  std::cout << std::oct << addr << std::endl;
  std::cout << std::hex << addr << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...