Через несколько дней у меня будет экзамен по программированию на C, в примере, который мне дали, есть проблема с побитовыми операторами. Теперь я знаю &, |, ^, <<, >> и что они делают. Но меня это немного смущает:
int main()
{
int i = 021, j = 0x2A, k,l,m;
k = i | j;
l = i & j;
m = k ^ l;
printf("%d, %d, %d, %d, %d\n",i,j,k,l,m);
return 0;
}
Когда я его тестирую, результат: 17 42 59 0 59
Но я не понимаю как. Что такое 021 в двоичном формате? Если я возьму его как 21 (если я удалю 0 перед ним, результат полностью изменится). Кто-нибудь может помочь, пожалуйста?





What is 021 in binary? If I take it as 21, (if I delete the 0 before it, the output changes completely.)
Целочисленный литерал, начинающийся с 0, является восьмеричным числом. Если вы удалите 0, это десятичное число. Таким образом, значение 021 - это 2 * 8 + 1, то есть 17. Двоичное представление - 10001.
Если 0 удален, значение i будет 21, а двоичное представление - 10101.
Таким образом, выходные данные соответственно изменяются при использовании в различных операциях.
Поскольку вы используете спецификатор преобразования d в своем операторе printf, все напечатанные значения будут десятичными.
Когда вы используете начальный ноль, и это нет
0x(что означает шестнадцатеричный), тогда021представляет собой восьмеричный, что представляет собой десятичное 17 или0x11(шестнадцатеричное). Может быть более полезным, если вашprintfиспользует%xвместо%d.