Оператор адреса в системе с прямым порядком байтов - PullRequest
0 голосов
/ 09 декабря 2018

Многие люди знают следующий пример, чтобы узнать, является ли система прямым или прямым порядком байтов:

#include <stdio.h> 
int main()  
{ 
   unsigned int i = 1; 
   char *c = (char*)&i; 
   if (*c)     
       printf("Little endian"); 
   else
       printf("Big endian"); 
   getchar(); 
   return 0; 
} 

Однако я хотел бы знать, является ли следующий фрагмент кода также действительным и функциональным:

#include <stdio.h>
int main()
{
   unsigned int i = 1;
   char *c = &i;
   if (*c)
       printf("Little endian");
   else
       printf("Big endian");
   getchar();
   return 0;
}

Это в основном касается вопроса о том, как интерпретируется оператор адреса & в системах с прямым порядком байтов.

Предположим, что вы не выполняете преобразование типов, как указано выше, а такжеПредположим, что система с прямым порядком байтов возвращает вам старший битовый адрес (в основном там, где начинается int), тогда этот фрагмент кода будет по-прежнему выводить «Little endian», хотя вы действительно имеете дело с системой с прямым порядком байтов.

Любой комментарий по этому вопросу был бы очень полезен.Заранее благодарю: D.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Присвоение char *c = &i; нарушает ограничения в C 2018 6.5.16.1 1. В этом параграфе говорится: «Должно быть выполнено одно из следующего», и наиболее близким совпадением в списке параметров является:

  • левый операнд имеет атомарный, квалифицированный или неквалифицированный тип указателя, и (учитывая тип, который левый операнд будет иметь после преобразования в lvalue) оба операнда являются указателями на квалифицированные или неквалифицированные версии совместимых типов, а тип, на который указывает левый, имеетвсе квалификаторы типа, указанного справа;

char * и int * несовместимы, поэтому присваивание не соответствует ограничениям.

Тем не менее, есликомпилятор принял это утверждение (что может, поскольку стандарт C допускает расширения) и преобразует указатель справа в тип слева (как это должно быть в присваиваниях), результатом должен быть указатель на младший адресуемый байт объектанезависимо от порядка байтов.Это нормально для преобразования указателей в C 2018 6.3.2.3 7:

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

0 голосов
/ 09 декабря 2018

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

...