Как компилятор ведет себя при чтении памяти в программе C? Это следующий код, который я написал, чтобы понять: - PullRequest
1 голос
/ 27 мая 2020

Я указал p на целое n. Читая значение, я привожу его к типу char. Это говорит компилятору, что он должен прочитать только 1 байт данных. Система выделяет 4 байта для целых чисел и 1 для символов. 345 = 00000000 00000000 00000001 01011001 Итак, компилятор читает последний байт 01011001 = 89. Я просто хотел знать, все ли компиляторы начинают читать с LSB? Мне было интересно, можем ли мы получить вывод как MSB = 0;

void main()
{
  unsigned int n=345;
  char c = 't';

  void *p = &n;
  printf("%d",*((char *)p)); 

}

Output : 
89

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Да, архитектура с прямым порядком байтов будет печатать 0 вместо 89. Вы можете увидеть это здесь: https://godbolt.org/z/pLHMDd - PowerP C имеет прямой порядок байтов и в результате дает ноль.

1 голос
/ 27 мая 2020

Как компилятор ведет себя при чтении памяти в программе C?

Компилятор используется во время компиляции для преобразования исходного кода в машинный код . Машинный код (исполняемый или двоичный файл AKA) используется для запуска программы во время выполнения.

Мне было интересно, можем ли мы получить вывод как MSB = 0;

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

Ниже приведена адаптация вашего кода с некоторыми дополнительными функциями для иллюстрации обмена байтами и двоичного представления:

int main(void)
{
  unsigned int n=345;
  char c = 't';

  void *p = &n;
  printf("first byte before swap: %d\n",*((char *)p));

  //showing all bits for illustration
  printf("Binary - bytes before swap : %s\n\n", byte_to_binary32(n));

  //demonstration of byte swapping
  printf ( "\ndata before swapping : %04X" ,n);
  unsigned int new = swap(n);
  printf ( "\ndata after swapping : %04X\n" ,new);
  // end demo

  printf("Binary - bytes after swap: %s\n\n", byte_to_binary32(new));

  p = &new;
  printf("first byte after swap: %d\n",*((char *)p));

  return 0;

}

//unsigned 32 bit conversion
unsigned int swap (unsigned int data)
{ 
    unsigned int new = ((data>>24)&0xff) | // move byte 3 to byte 0
                                 ((data<<8)&0xff0000) | // move byte 1 to byte 2
                                 ((data>>8)&0xff00) | // move byte 2 to byte 1
                                 ((data<<24)&0xff000000); // byte 0 to byte 3;

    return new; 
}

const char *byte_to_binary32(long x)
{
    static char b[33]; // bits plus '\0'
    b[0] = '\0';
    char *p = b;  
    //unsigned long long z; required only if 64 bit conversion
    unsigned long z;//this is sufficient for 32 bit conversion
    for (z = 2147483648; z > 0; z >>= 1)       //2^32
    {
        *p++ = (x & z) ? '1' : '0';
    }
    return b;
}

Запуск этого демонстрационного приложения даст следующие результаты:

enter image description here

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