gpt4 book ai didi

int 的转换,unsigned int 用于 c 中的指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:42 24 4
gpt4 key购买 nike

我是 C 中指针的新手。请帮助我编写以下代码:

void main()
{
int i=3;
printf("unsighed Address of i = %u \n",(unsigned int)&i);
printf("int Address of i = %d\n",(int)&i);
printf("pointer Address of i = %p\n",&i);
printf("Value of i = %d\n",i);
}

输出:

unsighed Address of i = 3219915640 
int Address of i = -1075051656
pointer Address of i = 0xbfec0378
Value of i = 3

如您所见,我只是通过intunsigned int 和指针检查i 的地址。无符号值和指针值相同(base16 的 0xbfec0378 = base10 的 3219915640)。但是整数值是不同的。 int 范围是(-32768 到 32767)。所以我不知道我是怎么得到-1075051656的。你能解释一下吗?

最佳答案

如果要将指针值转换为整数类型,应使用 intptr_tuintptr_t,它们保证整数足够大以容纳任何可能的指针值(value)。

您可能正在为 32 位架构编译您的代码,或者您可能足够幸运,因此您的堆栈位于地址空间的较低区域(尽管这不太可能),因此在您的执行中最高有效位的地址是 0。

参见 https://en.cppreference.com/w/c/types/integer

代码(https://ideone.com/2NDYnP):

#include <stdio.h>    // printf
#include <stdint.h> // intptr_t, uintptr_t
#include <inttypes.h> // PRIdPTR, PRIuPTR

int main() {
int i=3;
// Incorrect
printf("unsighed value of &i = %u \n",(unsigned int)&i);
printf("int value of &i = %d\n",(int)&i);

// Correct
printf("pointer Address of i = %p\n",&i);
printf("uintptr_t value of &i = %"PRIuPTR"\n", (uintptr_t)&i);
printf("intptr_t value of &i = %"PRIdPTR"\n", (intptr_t)&i);

printf("Value of i = %d\n",i);

return 0;
}

结果:

unsighed value of &i = 3131233804 
int value of &i = -1163733492
pointer Address of i = 0x7fffbaa2d60c
uintptr_t value of &i = 140736324621836
intptr_t value of &i = 140736324621836
Value of i = 3

关于int 的转换,unsigned int 用于 c 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com