强制转换为int,无符号int用于c中的指针

时间:2018-11-21 09:30:33

标签: c pointers casting

我是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

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

2 个答案:

答案 0 :(得分:1)

您将int range is (-32768 to 32767)放在哪里?这意味着大小为2个字节。 我认为情况并非如此,因为-1075051656int(您将地址转换为int)。

要检查int的大小,请使用sizeof(int),或使用INT_MIN, INT_MAX常量来查找其表示的值的间隔。

系统中int的大小可能为4字节(32位),间隔为-21474836482147483647。对于unsigned int,它来自0 to 4,294,967,295

因此,您可以使用unsigned int打印该值,但是自int起转换为4294967295 > 3219915640 > 2147483647时它会溢出

答案 1 :(得分:1)

如果要将指针值转换为整数类型,则应使用intptr_tuintptr_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