Наиболее значимые 32 бита теряются при приведении указателя на int64_t - PullRequest
2 голосов
/ 19 июня 2009

Может кто-нибудь объяснить следующее странное поведение?

Я запускаю следующую программу на 64-битной платформе Intel:

include <stdio.h>
#include <stdint.h>

int main(void)
{
  int x;
  int *ptr = &x;

  printf("ptr = %p\n", ptr);
  printf("sizeof(ptr) = %d\n", sizeof(ptr));

  int64_t i1 = (int64_t) ptr;
  printf("i1 = 0x%x\n", i1);
  printf("sizeof(i1) = %d\n", sizeof(i1));

  return 0;
}

Эта программа производит следующий вывод:

ptr = 0x7fbfffdf2c
sizeof(ptr) = 8
i1 = 0xbfffdf2c
sizeof(i1) = 8

Может кто-нибудь объяснить, почему i1 содержит только младшие 32 бита ptr? (Обратите внимание, что отсутствует 0x7f).

Compiler: gcc version 3.4.6 20060404 (Red Hat 3.4.6-9)
OS: Linux scream 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux
Processor: Intel(R) Xeon(R) CPU E5430  @ 2.66GHz

Ответы [ 2 ]

13 голосов
/ 19 июня 2009

Это никуда не делось .. ваше заявление о печати неверно. Попробуйте это:

printf("i1 = 0x%lx\n", i1);
2 голосов
/ 19 июня 2009

Сначала вы приводите указатель к целому числу со знаком - это неправильно - указатели не подписаны. Затем вы печатаете 64-битное значение с модификатором формата %x, который ожидает 32-битное значение в стеке. Попробуйте скомпилировать с -Wall -pedantic и позвольте gcc пожаловаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...