У меня есть код, который использует биты для хранения нескольких 1 битовых значений в char.Назначить член поля бит на char
В основном
struct BITS_8 {
char _1:1;
(...)
char _8:1;
}
Теперь я пытался передать один из этих битов в качестве параметра в функцию
void func(char bit){
if(bit){
// do something
}else{
// do something else
}
}
// and the call was
struct BITS_8 bits;
// all bits were set to 0 before
bits._7 = 1;
bits._8 = 0;
func(bits._8);
Решение было выделить бит при вызове функции:
func(bits._8 & 0x80);
Но я продолжал идти в //do something
, потому что были установлены другие биты. Мне было интересно, правильно ли это поведение или если мой компилятор сломан. Компилятор - это встроенный компилятор, который создает код для freescale ASIC.
РЕДАКТИРОВАТЬ: 2 ошибки: передача параметра и того бита._8 должно быть 0, иначе ошибка не имеет смысла.
Разъяснение
Я заинтересован в том, что стандарт должен сказать о назначении
struct X{
unsigned int k:6;
unsigned int y:1;
unsigned int z:1;
}
X x;
x.k = 0;
x.y = 1;
x.z = 0;
char t = X.y;
теперь должен содержать t
1
или b00000010
?
0x128 не один бит –
'128 == 0x80', я думаю, вы этого хотели. –
iirc правильно, битовое поле, определенное как char _a: 1, может принимать только значения 0 или 1, так как это 1 бит в ширину, поэтому 'func (bits._8 & 0x1);' это правильная вещь. – fvu