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

标签 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

最佳答案

它哪儿也没去.. 你的打印语句是错误的。试试这个:

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

关于c - 将指针转换为 int64_t 时丢失了最重要的 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018452/

相关文章:

将短数组的值复制到长数组

c - 为什么两个变量共享同一个地址?

linux - ARM交叉编译Linux系统安装报错unable to locate package

c++ - 遗留代码改变了一个 const 指针。有正当理由吗?

c - 在 64 位机器上分析 Set 实现

c - 从 execl() 运行脚本

c - 对于数组,为什么 a[5] == 5[a]?

c++ - 铛。如何克服 "unknown builtin"错误消息

c++ - 如何处理这些旧式类型转换?

casting - typescript :在评论中设置变量类型