将指针转换为int64_t时,最重要的32位丢失

时间:2009-06-19 15:00:59

标签: c gcc casting

有人可以解释以下奇怪的行为吗?

我在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只包含ptr的最低32位吗? (注意它缺少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 个答案:

答案 0 :(得分:13)

它没有去过任何地方..你的打印声明是错误的。试试这个:

printf("i1 = 0x%lx\n", i1);

答案 1 :(得分:2)

首先,您正在将指针转换为有符号整数 - 这是错误的 - 指针是无符号的。 然后使用%x格式修饰符打印64位值 - 它需要堆栈上的32位值。尝试使用-Wall -pedantic进行编译,然后让gcc抱怨。