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

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

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

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

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

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

Ответ 1

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

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

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

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

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

Итак, &i предоставит LSB-адрес i, если он немного endian, или он даст адрес MSB i, если большой 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++

Ответ 2

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

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

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

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


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

Да


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

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

Ответ 3

Это зависит от сущности платформы; если это платформа с маленькими терминами, вы получите указатель на 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 placeholder, а не %d.

Ответ 4

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

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

Ответ 5

То, что это означает, - это MSB для моего VС++ 2010 и Digital Mars. Но это связано с контентом.

Ответ на этот вопрос дает вам некоторую информацию: Обнаружение законности программно в программе на С++.

Здесь пользователь "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);
}

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

Ответ 6

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

Это зависит от машины и ОС. На больших компьютерах и ОС вы получите MSB, а на маленьких конечных машинах и ОС вы получите LSB.

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

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

     

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