Проблема с порядком байтов? - PullRequest
1 голос
/ 22 ноября 2010

Каким будет вывод следующего кода?

#include<stdio.h>
int main()
{
    int a[4]={4096,2,3,4};
    char *p;
    p=a;
    printf("\n %d",(int)*(++p));
    return 0;
}

sizeof int = sizeof(void*) = 4 bytes

По моему мнению, вывод должен быть 16 на машине с прямым порядком байтов и 0 на машине с прямым порядком байтов.Я прав?

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

4096 равно 0x1000, поэтому (как только вы его скомпилируете) вы ожидаете 16 с представлением с прямым порядком байтов и 0 с представлением с прямым порядком байтов, если int не имеет ширину 24 бита (что даст 16).

Все это при условии CHAR_BIT == 8, и никаких смешных дел с дополнительными битами. Редактирование с sizeof(int) == 4 также исключает 24-битный int при этих допущениях.

1 голос
/ 22 ноября 2010

4096 (шестнадцатеричный 0x1000) будет представлен в памяти (при условии 8-битных байтов, что довольно часто встречается в настоящее время) как:

[0x00, 0x00, 0x10, 0x00] (big-endian)

или

[0x00, 0x10, 0x00, 0x00] (little-endian)

Поскольку выраспечатывая его, используя% d, который ожидает целые числа, но передавая значение указателя разыменованного символа (т. е. char) и увеличивая указатель перед разыменованием, вы напечатаете либо 0x00, либо 0x10, что составляет 16 в десятичном виде.Возможно, вам потребуется добавить приведение, чтобы разрешить оператор p = a, поскольку вы смешиваете типы довольно свободно.

Так что да, я думаю, что вы правы.

...