Указывает ли указатель на 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++? Скорее всего, нет.
