Почему декабрьский адрес памяти уменьшается, а шестнадцатеричный адрес памяти возрастает? - PullRequest
0 голосов
/ 07 мая 2018

Я написал C-программу для ввода значений 5 int / float / double с клавиатуры и сохранения их в массиве соответствующего типа данных.

Программа записывает на экран таблицу, в которой первый столбец содержит адреса памяти элементов массива в десятичном формате, второй столбец содержит адреса памяти элементов массива в шестнадцатеричном формате, а третий столбец содержит целочисленные значения, хранящиеся в адреса памяти.

При проверке таблицы я заметил, что значение адреса памяти типа int и float уменьшается на 4 байта и удваивается на 8, тогда как шестнадцатеричное значение увеличивается на 4 и 8 байтов.

Почему адрес памяти Dec уменьшается и адрес памяти Hex возрастает?

#include <stdio.h>
#define SIZE 5

main()
{
    int i;
    int intArray[SIZE];
    float floatArray[SIZE];
    double doubleArray[SIZE];

    int* ptrIntArray;
    float* ptrFloatArray;
    double* ptrDoubleArray;

    ///assign pointers to arrays to point to the start of each array
    ptrIntArray=intArray;
    ptrFloatArray=floatArray;
    ptrDoubleArray=doubleArray;

    printf("enter %d integers: \n", SIZE);
    for(i=0; i<SIZE; i++)
    {
        scanf("%d", &intArray[i]);
    }
    printf("enter %d floats: \n", SIZE);
    for(i=0; i<SIZE; i++)
    {
        scanf("%f", &floatArray[i]);
    }
    printf("enter %d doubles: \n", SIZE);
    for(i=0; i<SIZE; i++)
    {
        scanf("%lf", &doubleArray[i]);
    }

    printf("Memory address base 10\tMemory address base 16\tcontents at address\n");
    printf("Integers:\n\n");
    for(i=0; i<SIZE; i++)
    {
        printf("%d\t\t\t%x\t\t\t%d\n",ptrIntArray+i,ptrIntArray+i,*(ptrIntArray+i));
    }
    printf("\nFloats:\n\n");
    for(i=0; i<SIZE; i++)
    {
        printf("%d\t\t\t%x\t\t\t%f\n",ptrFloatArray+i,ptrFloatArray+i,*(ptrFloatArray+i));
    }
    printf("\nDoubles:\n\n");
    for(i=0; i<SIZE; i++)
    {
        printf("%d\t\t\t%x\t\t\t%lf\n",ptrDoubleArray+i,ptrDoubleArray+i,*(ptrDoubleArray+i));
    }
}

Выход:

enter 5 integers: 
1
2
3
4
5
enter 5 floats: 
1.5
2.5
3.5
4.5
5.5
enter 5 doubles: 
1.55
2.55
3.55
4.55
5.55
Memory address base 10  Memory address base 16  contents at address
Integers:

-516081056          e13d3a60            1
-516081052          e13d3a64            2
-516081048          e13d3a68            3
-516081044          e13d3a6c            4
-516081040          e13d3a70            5

Floats:

-516081088          e13d3a40            1.500000
-516081084          e13d3a44            2.500000
-516081080          e13d3a48            3.500000
-516081076          e13d3a4c            4.500000
-516081072          e13d3a50            5.500000

Doubles:

-516081136          e13d3a10            1.550000
-516081128          e13d3a18            2.550000
-516081120          e13d3a20            3.550000
-516081112          e13d3a28            4.550000
-516081104          e13d3a30            5.550000

Process returned 0 (0x0)   execution time : 57.533 s
Press ENTER to continue.

1 Ответ

0 голосов
/ 07 мая 2018
-516081056          e13d3a60
-516081052          e13d3a64
-516081048          e13d3a68
-516081044          e13d3a6c
-516081040          e13d3a70

Оба набора чисел увеличиваются на 4 каждую итерацию.Десятичные числа отрицательны, это все.Используйте %u для печати беззнаковых десятичных чисел.

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