Почему длина адреса переменной всего 6 цифр в шестнадцатеричном коде, хотя моя машина 64-битная? - PullRequest
0 голосов
/ 09 июля 2020

Когда я попытался распечатать адрес переменной в C на свой стандартный вывод в шестнадцатеричном формате, я получил ответ 6 di git, к моему удивлению. Поскольку я работаю на 64-битной машине, я ожидал, что у меня будет длинный адрес 16 di git, начиная с 2^{64} = 16^{16}, но вместо этого адрес был всего 6 цифр.

Код для справки:

#include<stdio.h>

int square();

int x;

int main(){
    scanf("%d",&x);
    printf("%d\n",square());
    printf("\naddress of x is %x",&x);
    return 0;
}

int square(){
    return x*x;
}

Результат был: address of x is 407970

1 Ответ

4 голосов
/ 09 июля 2020

Прежде всего printf("\naddress of x is %x",&x); неверно. %x ожидает unsigned int.

Правильный спецификатор формата для печати адреса: %p ( подробнее здесь ):

printf("\naddress of x is %p",&x);

//To be more precise cast to void*, see @Gerhardh's comment below
printf("\naddress of x is %p", (void*)&x);

Почему длина адреса переменной всего 6 цифр в шестнадцатеричном коде, хотя моя машина 64-битная?

unsigned long x = 10;
printf("%lu", x); //prints 10

x равно 10 в приведенном выше примере. Означает ли это, что x теперь имеет ширину 8 бит? Нет. Точно так же существует диапазон адресов, начинающийся с 0, адрес не должен быть достаточно большим, чтобы всегда быть представлен как полный 64-битный. В вашем случае это может быть 0x00407970.

Примечание: Следующее будет иметь неопределенное поведение , если значение x велико. Просто введите 123123 в качестве ввода и посмотрите, что произойдет

int square(){
    return x*x;
}
...