я ожидал 1 как выход ..Почему следующий код в C печатает -1?
#include<stdio.h>
int main(){
struct A{
int a:1;
};
struct A bb;
bb.a=1;
printf("%d",bb.a);
return 0;
}
я ожидал 1 как выход ..Почему следующий код в C печатает -1?
#include<stdio.h>
int main(){
struct A{
int a:1;
};
struct A bb;
bb.a=1;
printf("%d",bb.a);
return 0;
}
Делая int a:1
, вы настраиваете a
как 1 bit signed int
. Он представлен 1 бит и предполагает представление двух дополнений в вашей реализации, он имеет диапазон {0,-1}
. Поэтому установка 1
на a
будет представлять значение -1
.
Добавление:
обратить внимание, что на C90
стандарт, простой int
является signed int
; но когда дело доходит до бит-полей, выполняется следующее:
Битовое поле может иметь тип int, unsigned int или подписанный int. Являются ли позиция бита высокого порядка простого
int
битового поля рассматриваются как знаковый бит является реализация определенного
Разве это не реализация, независимо от того, подписано это поле или нет? –
@ Анонимный, да. Вот почему лучше быть явным - используйте 'signed int' или' unsigned int', чтобы сделать платформу кода незаметной. –
Спасибо всем за ответ ... @ArjunSreedharan Sreedharan .. почему он дает -1 по нечетным значениям и 0 по четным значениям. –
Вашего битовым поле представляет собой целое число со знаком размера 1. Допустимы только подписанных значениями одного бита равны 0 (0
) и -1 (1
), так как наиболее значимым (и единственным) битом считается бит знака.
Вы можете увидеть это более ясно, если учесть два-битовые значения: 0 (00
), 1 (01
), -1 (11
) -2 (10
).
Если вы перейдете на unsigned int a:1
, вы встретите свое ожидание.
A 1-разрядное знаковое поле на двоичное дополнение машина может принимать только значения 0 или -1, Нашел здесь http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html
http://stackoverflow.com/questions/14336994/c-bit-field -variables-are-printing-неожиданные значения – Gopi