ноль в промежуточном литерале в C - PullRequest
0 голосов
/ 07 октября 2018

Что означает следующее в языке программирования C?Я понимаю, что в моей первой строке у меня есть шестнадцатеричный литерал, я не совсем понимаю, что делает моя вторая строка.Без фактического запуска кода, как я могу узнать, что делает этот код?Я готовлюсь к экзамену, где мне придется сделать это на бумаге.

int aaa = 0x5c0000a3;
printf( "%08x %08x\n", (aaa >> 12), (aaa << 16) ); 

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

это операторы сдвига битов или просто операторы сдвига

  • Сдвиг вправо (>>)
  • Сдвиг влево (<<) </li>

теперь ваш код

int aaa = 0x5c0000a3;

в двоичном формате aaa будет выглядеть следующим образом

1011100000000000000000010100011

в printf есть два выражения, первое выражение (aaa >> 12) сдвигает 12 бит вправо, заполняя 12 бит с левой стороны до нулей, что приводит к двоичному значению, например

1011100000000000000

, которое при преобразовании в шестнадцатеричный код приводит к 0x5C000, соответствующему спецификатору формата для этогоравен %08x, который будет заполнять нули слева и выводить 0005c000 на консоль

Аналогичная ситуация происходит при применении left shift, где aaa смещается влево при заполнении 16 нулевыми нулевыми битами справа.

0 голосов
/ 07 октября 2018

Во второй строке: «>>» указывает сдвиг бит вправо, «<<» - сдвиг бит влево.Таким образом, он собирается напечатать строку на консоль со значением aaa, смещенным вправо на 12, а затем смещенным влево на 16. </p>

Для расширения: преобразовать шестнадцатеричное значение в двоичное, сдвинуть каждый бит вправо 12, преобразовать в целое число с8 мест.Затем сдвиньте все биты влево на 16 позиций и снова конвертируйте.

...