Что означает (unsigned char)~0 >> 1?

Помогите разобраться в коде! Нужно максимальное и минимально значение signed и unsigned char. Не понимаю, что значит >> и ~

signed char max_char_s = (char)((unsigned char)~0 >> 1);
signed char min_char_s = max_char_s + 1;
unsigned char max_char_u = (unsigned char)~0;
unsigned char min_char_u = 0;
printf("Signed Char: Max = %d, Min = %d\n", max_char_s, min_char_s);
printf("Unsigned Char: Max = %u, Min = %u\n", max_char_u, min_char_u);

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

NB оба примера упрощены, чтобы было легче понять.

~ - инверсия всех битов числа. ~0 - значение в котором все биты установлены. Если было 000000002, получится 111111112.

>> - смещает биты на несколько позиций вправо, старшие биты обнуляются. В случае >> 1 если было 111111112, станет 011111112.

Но лучше не играть с битами, а использовать стандарт:

limits.h:

#include <limits.h>
#include <stdio.h>
 
int main(void) {
    printf(" CHAR_MIN = %5d\n"  ,  CHAR_MIN);
    printf(" CHAR_MAX = %5d\n\n",  CHAR_MAX);
    printf("SCHAR_MIN = %5d\n"  , SCHAR_MIN);
    printf("SCHAR_MAX = %5d\n\n", SCHAR_MAX);
    printf("UCHAR_MAX = %5u\n"  , UCHAR_MAX);
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror -Wwrite-strings -Wconversion char-limits.c

$ ./a.out 
 CHAR_MIN =  -128
 CHAR_MAX =   127

SCHAR_MIN =  -128
SCHAR_MAX =   127

UCHAR_MAX =   255
→ Ссылка