приведение int, беззнаковое int для указателей в c - PullRequest
0 голосов
/ 21 ноября 2018

Я новичок в указателях на 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 и указатель.Значения без знака и указателя совпадают (0xbfec0378 из base16 = 3219915640 из base10).Но целочисленное значение другое.диапазон int (от -32768 до 32767).Так что я не знаю, как я получил -1075051656.Можете ли вы объяснить это.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Если вы хотите привести значение указателя к целочисленному типу, вы должны использовать 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
0 голосов
/ 21 ноября 2018

Где вы основываетесь int range is (-32768 to 32767)?Это означает, что размер составляет 2 байта.Я не думаю, что это так, поскольку -1075051656 - это int (вы преобразовали адрес в int).

Чтобы проверить размер int, используйте sizeof(int),или чтобы найти интервал значений, которые он представляет, используйте INT_MIN, INT_MAX константы.

Размер int в вашей системе, вероятно, составляет 4 байта (32 бита) с интервалом от -2147483648 до 2147483647unsigned int это от 0 to 4,294,967,295.

Поэтому вы можете напечатать значение с помощью unsigned int, но оно переполняется при преобразовании в int, так как 4294967295 > 3219915640 > 2147483647

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...