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