если у меня есть следующий код:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
Я получу LSB-адрес я или MSB?
Будет ли он действовать по-разному между платформами?
Есть ли разница между C и С++?
если у меня есть следующий код:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
Я получу LSB-адрес я или MSB?
Будет ли он действовать по-разному между платформами?
Есть ли разница между C и С++?
Рассмотрим размер 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++
Я получу LSB-адрес я или MSB?
Это зависит от платформы: это будет самый младший адресный байт, который может быть MSB или LSB в зависимости от вашей платформы.
Хотя это не указано в стандарте напрямую, это подразумевается в разделе 6.3.2.3.7:
Когда указатель на объект преобразуется в указатель на тип символа, результат указывает на младший адресный байт объекта.
Будет ли он действовать по-разному между платформами?
Да
Есть ли разница между c и С++?
Нет: он зависит от платформы в C и С++
Это зависит от сущности платформы; если это платформа с маленькими терминами, вы получите указатель на 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
.
ptr хранит адрес стартового байта целочисленного объекта. Будь то, где хранится основной или младший байт, зависит от вашей платформы. Некоторые странные платформы даже используют смешанную консистенцию, и в этом случае это не будет ни MSB, ни LSB.
В этом отношении нет разницы между C и С++.
То, что это означает, - это 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);
}
Это дает некоторую информацию о контенте
Ну, я получаю LSB-адрес я или MSB?
Это зависит от машины и ОС. На больших компьютерах и ОС вы получите MSB, а на маленьких конечных машинах и ОС вы получите LSB.
Windows всегда немного ориентирована. Все (большинство?) Вкусов Linux/Unix на x86 мало ориентированы. Linux/Unix на машинах Motorola - большой аргумент. Mac OS на компьютерах x86 мало ориентирована. На машинах PowerPC это большой endian.
Хорошо, что он действует по-разному между платформами? Да, будет.
Есть ли разница между c и С++? Наверное, нет.