Почему похоже, что массивы индексируются обратно в c union? - PullRequest
0 голосов
/ 22 апреля 2019

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

Для целого числа с двоичным представлением 10000000 00000000 00000000 00000000, Я ожидаю, что b [0] = 10000000, b [1] = 00000000 и т. Д.

#include <stdio.h>
#include <stdlib.h>

typedef union intByteRep{
    unsigned int i;     // 00000000 00000000 00000000 00000000
    unsigned char b[4]; //   b[0]     b[1]     b[2]     b[3]  - What we would expect
                        //   b[3]     b[2]     b[1]     b[0]  - What is happening  
} intByteRep;

char *binbin(int n);

int main(int argc, char **argv) {

    intByteRep ibr;
    ibr.i = 2147483648; // 10000000 00000000 00000000 00000000

    for(int i = 0; i < 4; i++){
        printf("%s ", binbin(ibr.b[i]));
    }
    printf("\n"); // prints 00000000 00000000 00000000 10000000

    for(int i = 3; i >= 0; i--){
        printf("%s ", binbin(ibr.b[i]));
    }
    printf("\n"); // prints 10000000 00000000 00000000 00000000

    return 0;
}

/*function to convert byte value to binary string representation*/
char *binbin(int n)
{
    static char bin[9];
    int x;
    for(x=0; x<8; x++)
    {
        bin[x] = n & 0x80 ? '1' : '0';
        n <<= 1;
    }
    bin[x] = ' ';
    return(bin);
}

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Порядок, в котором байты хранятся в памяти, является функцией от порядкового номера на вашей платформе. В этом случае ваша система имеет младший порядок, поэтому вы наблюдаете, что байты по старшим адресам int, которые они составляют, содержат самые значимые биты (который, в вашем примере 2147483648, представляет собой один бит 1 в самая значимая цифра).

2 голосов
/ 22 апреля 2019

потому что ваша система имеет младший порядок байтов.

32-битное целое число 0x11223344 хранится в памяти 0x44 0x33 0x22 0x11

в системе с прямым порядком байтов он будет храниться как: 0x11 0x22 0x33 0x44

Между прочим, большинство популярных uP имеют порядок байтов.

1 голос
/ 22 апреля 2019

В те дни, когда компьютерам часто приходилось обрабатывать числа, превышающие то, что они могли обработать за один шаг, сложение и вычитание, как правило, требовали бы, чтобы компьютер сначала обрабатывал младшие части числа, так же какобрабатывать числа вручную.Если добавить от 123 к 678 и начать с добавления последней цифры каждого добавления (3 и 8), можно будет определить последнюю цифру результата 1, записать ее и забыть об этом, кроме того факта, чтобыл нести, прежде чем нужно было даже взглянуть на любые другие части добавления.Затем можно добавить средние цифры с переносом из предыдущего числа и узнать, что средняя цифра результата равна 0, не глядя на первую цифру любого из операндов.Затем можно вычислить первую цифру результата.

Если бы вы начали с добавления 1 к 7, вы бы не смогли с уверенностью записать первую цифру результата, пока не обработаетевторая и третья цифры, а также.Таким образом, нужно будет либо отслеживать все цифры до тех пор, пока вы не закончите вычисление, либо захотеть записать неверный результат из предыдущих цифр, а затем скорректировать их, если есть перенос.Не так хорошо или эффективно.

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

...