Указывает ли указатель на LSB или MSB?

если у меня есть следующий код:

int i = 5;
void * ptr = &i;
printf("%p", ptr);

Я получу адрес LSB i или MSB?
Будет ли он действовать по-разному между платформами?
Есть ли разница между C и C++?

6 ответов


рассмотрим размер int - это 4 байта. Всегда &i will дает вам первый адрес этих 4 байтов.

если архитектура немного endian, то нижний адрес будет иметь LSB, как показано ниже.

        +------+------+------+------+
Address | 1000 | 1001 | 1002 | 1003 |
        +------+------+------+------+
Value   |   5  |    0 |    0 |    0 |
        +------+------+------+------+

если архитектура большая endian, то нижний адрес будет иметь MSB, как показано ниже.

        +------+------+------+------+
Address | 1000 | 1001 | 1002 | 1003 |
        +------+------+------+------+
Value   |   0  |    0 |    0 |    5 |
        +------+------+------+------+

так &i даст LSB адрес i если маленький эндиан или он даст адрес MSB i если большой эндиан!--11-->

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

ниже логика будет говорит вам endianess

int i = 5; 
void * ptr = &i; 
char * ch = (char *) ptr;

printf("%p", ptr); 
if (5 == (*ch))
    printf("\nlittle endian\n");
else
    printf("\nbig endian\n");

такое поведение будет одинаковым для обоих c и c++


Это зависит от endianness платформы; если это платформа с малым концом, вы получите указатель на LSB, если это платформа с большим концом, она укажет MSB. Есть даже такие, смешанного с прямым платформы, в этом случае да помилует Господь твою душу проверьте документацию вашего компилятора/процессора.

тем не менее, вы можете выполнить быструю проверку во время выполнения:

uint32_t i=0x01020304;
char le[4]={4, 3, 2, 1};
char be[4]={1, 2, 3, 4};
if(memcmp(&i, le, 4)==0)
    puts("Little endian");
else if(memcmp(&i, be, 4)==0)
    puts("Big endian");
else
    puts("Mixed endian");

кстати, для печати указателей необходимо использовать %p местозаполнитель, не %d.


Я получу адрес LSB i или MSB?

Это зависит от платформы: это будет самый низкий адресованный байт, который может быть MSB или LSB в зависимости от вашей платформы endianness.

хотя это не написано в стандарте напрямую, это то, что подразумевается в разделе 6.3.2.3.7:

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


будет ли он действовать по-разному между платформами?

да


есть ли здесь разница между c и c++?

нет: он зависит от платформы как в C, так и в C++


ptr хранит адрес начального байта объекта integer. Является ли это место, где хранится самый или наименее значимый байт, зависит от вашей платформы. Некоторые странные платформы даже используют смешанную эндианность, и в этом случае это не будет ни MSB, ни LSB.

в этом отношении нет разницы между C и c++.


что это указывает на MSB для моего VC++ 2010 и Digital Mars. Но это связано с порядком следования байтов.

ответы на этот вопрос дают некоторую информацию для вас: обнаружение endianness программно в программе c++.

здесь пользователь "none" говорит:

#define BIG_ENDIAN      0
#define LITTLE_ENDIAN   1
 int TestByteOrder()
{
   short int word = 0x0001;
   char *byte = (char *) &word;
   return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN);
}

Это дает некоторую информацию endianness


ну, я получаю адрес LSB i или MSB?

это зависит от машины и ОС. На большой endian машинах и ОС вы получите MSB и на маленьких машинах с прямым, так и ОС вы получите ЛСБ.

Windows всегда немного endian. Все (большинство ?) вкусы Linux / Unix на x86 немного endian. Linux / Unix на машинах Motorola-это большой endian. Mac OS на машинах x86 немного endian. На машинах PowerPC это большой endian.

ну, он действует по-разному между платформами? Да, будет.

есть ли здесь разница между c и c++? Скорее всего, нет.