ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
24 июня
1526272 Топик полностью
Eddy_Em (Вчера, 09:33, просмотров: 42) ответил Nikolay_Po на Второй вариант был бы ОК, если бы && использовалось. В противном случае, приличный компилятор пожалуется на возможное переполнение. И любой компилятор запишет лишь нулевой бит результата. Например. 0b11111110 даст ноль в члене структуры. Я так думаю.
Не надо думать, надо проверять! Я действительно не прав: 
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct{
    uint8_t a: 1;
    uint8_t b: 2;
    uint8_t c: 5;
} shit_t;

int main(int argc, char **argv){
    if(argc < 3) return -1;
    shit_t X = {0};
    int a = atoi(argv[1]), b = atoi(argv[2]);
    int _ = a & b;
    X.a = _; X.b = _; X.c = _;
    printf("a/b/c=%d/%d/%d\n", X.a, X.b, X.c);
    return 0;
}

gcc 1.c 

./a.out 8 7 a/b/c=0/0/0
./a.out 1 3 a/b/c=1/1/1
./a.out 3 7 a/b/c=1/3/3
./a.out 255 7 a/b/c=1/3/7
./a.out 7 4 a/b/c=0/0/4

Как видите, автоматом это все "урезается" до содержимого. Но вот на поведение последнего я надеялся иначе… А тут - бдыщ серпом по яйцам, и все старшие биты в мусорку…

eddy-em.livejournal.com github.com/eddyem