Я не могу понять, почему операция 'c | 11100000 не работает. Но я также заметил, что 'c | 10000000 работает как положено.
#include <stdio.h>
int main()
{
unsigned char c, c1;
c = c & 0;
c = c | 11100000;
printf("%o \t", c);
/** prints 140 ***/
c = c & 0;
c = c | 111;
c << 5;
printf("%o", c);
/** prints 157 **/
return 0;
}
Я пытался закодировать символ UTF8.
Почему вы используете Octal?
user994886, Если вы ожидаете "340" в качестве восьмеричного вывода, рассмотрите восьмеричную константу c = c | 0340;.





Используемые постоянные значения представлены в десятичном, а не в двоичном формате.
C не поддерживает двоичные константы, но поддерживает шестнадцатеричные константы:
c = c | 0xe0;
...
c = c | 0x7;
Кроме того, это ничего не делает:
c << 5;
Предположительно, вы хотите:
c = c << 5;
Спасибо. исправил его на c = c << 5;
C не поддерживает двоичные константы, но некоторые компиляторы имеют их как расширение: c | 0b11100000
В качестве примечания я считаю, что двоичные константы были предложены для грядущего C2x. Я предполагаю, что люди в комитете никогда не программировали 32-битные или более крупные процессоры... Я так с нетерпением жду MY_REGISTER = 0b00111011010100110001100111100011; Потому что магические числа в шестнадцатеричном формате были не так уж плохи, я полагаю?
c <<= 5; тоже справится.
Проблема путаницы в том, что вы думаете, что эта целочисленная константа 11100000 представляет собой двоичный литерал. То есть 1 и 0 являются битовыми значениями.
Однако, если вы выполните этот оператор
printf( "11100000 = %x\n", 11100000 );
вы увидите, что шестнадцатеричное представление константы равно a95f60
11100000 = a95f60
Итак, в этом заявлении
c = c | 11100000;
младший байт, равный 0x60 (или в десятичном виде 96), присваивается переменной c.
Это не то же самое, если написать
c = c | 111;
c <<= 5;
Кроме того, обратите внимание на то, что это выражение
c << 5;
не имеет эффекта. Кажется, ты имеешь в виду
c <<= 5;
что эквивалентно умножению десятичного значения 111 на 32 и повторному присвоению менее значимого байта переменной c.
Если вы выполните это утверждение
printf( "111 << 5 = %d\n", 111 << 5 );
тогда вы увидите, что результат
111 << 5 = 3552
Как видно 3552 не то же самое, что 11100000.
Таким образом, вывод этого оператора
c = 111 << 5;
printf( "%d\n", c);
является десятичным 224.
В отличие от C++ в C нет целочисленных двоичных констант.
В С++ есть двоичные литералы, и вы можете получить ожидаемый результат, запустив эту программу.
#include <cstdio.h>
int main()
{
unsigned char c = 0;
c = c | 0b11'100'000;
printf( "%o\t", c );
c = 0b111;
c <<= 5;
printf( "%o\n", c );
}
Вывод программы
340 340
11100000— десятичное число, обозначающее одиннадцать миллионов и сто тысяч. Вы ожидали, что это будет двоичное число двести двадцать четыре?