我是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
如您所见,我只是通过i
,int
和指针检查unsigned int
的地址。无符号和指针值相同(base16的0xbfec0378 = base10的3219915640)。
但是整数值不同。 int范围是(-32768至32767)。所以我不知道怎么得到-1075051656。你能解释一下吗?
答案 0 :(得分:1)
您将int range is (-32768 to 32767)
放在哪里?这意味着大小为2个字节。
我认为情况并非如此,因为-1075051656
是int
(您将地址转换为int
)。
要检查int
的大小,请使用sizeof(int)
,或使用INT_MIN, INT_MAX
常量来查找其表示的值的间隔。
系统中int
的大小可能为4字节(32位),间隔为-2147483648
至2147483647
。对于unsigned int
,它来自0 to 4,294,967,295
。
因此,您可以使用unsigned int
打印该值,但是自int
起转换为4294967295 > 3219915640 > 2147483647
时它会溢出
答案 1 :(得分:1)
如果要将指针值转换为整数类型,则应使用intptr_t
或uintptr_t
,这可以保证整数足够大以容纳任何可能的指针值。
您可能正在为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