2012-04-10 17 views
7
#include<stdio.h> 

int main() 
{ 
    struct value{ 
     int bit1 : 1; 
     int bit3 : 4; 
     int bit4 : 4; 
     }bit={1,2,2}; 
    printf("%d %d %d\n",bit.bit1,bit.bit3,bit.bit4); 
    return 0; 
} 

wyjściowa:wyjaśnić zachowanie 1-bitowych bitowych pól

-1 2 2

Proszę wyjaśnić oupput programu?

+1

Wygląda jak zadanie domowe. – spidey

+1

To jest implementacja zdefiniowana, czy 'int' bit-pola są' signed int' lub 'unsigned int'. W niektórych kompilatorach można uzyskać "1 2 2" jako wynik. Dla przenośności powinieneś użyć 'unsigned int' lub' signed int' dla pól bitowych. Lub nie używaj pól bitowych. – ouah

Odpowiedz

8

Prawdopodobnie jedynym ciekłym wyjściem jest pierwszy.

Weź pod uwagę zakres wartości, które może reprezentować 1-bitowa liczba całkowita two's-complement.

+0

Czy możesz wyjaśnić nieco szczegóły produkcji? Jak właściwie zapisuje wartości w swoich polach? Powiedz, jeśli zmienię bit1: 1 bit2: 8 bit3: 8, pokazując -1 -8 -8 jako wynik, dlaczego tak jest? –

+0

@code_hacker: Musisz przeczytać o tym, jak działa dwójnik-dopełniacz (zobacz link w mojej odpowiedzi). To powinno mieć sens. –

9

bit1 to podpisana 1-bitowa liczba całkowita, która może zawierać tylko wartości -1 i 0.

+0

Inicjalizacja dokonuje konwersji z (podpisanej) liczby całkowitej "1" do tego zakresu, więc jest to nawet niezdefiniowane zachowanie, nie? –

2

Uwaga poniżej zestawienie wewnątrz struct:

int Bit1: 1; -> 'int' wskazuje , że jest to ZAPISANA liczba całkowita. W przypadku liczb całkowitych ze znakiem, lewy lewy bit zostanie użyty dla znaku +/-. Jeśli przechowujesz pole 1-bitowe: Lewy skrajny bit to 1, więc system traktuje wartość jako liczbę ujemną .

Metoda uzupełniania dwójki to używana przez system do obsługi ujemnych wartości .

Dlatego przechowywane dane to 1. Uzupełnienie 2 do 1 to także 1 (ujemne).

Dlatego drukowane jest -1.

Jeśli przechowujesz 2 w 4-bity pola: binarne 2: 0010 (od lewej najbardziej bit jest 0, więc system będzie traktować jako wartość dodatnia) 0010 wynosi 2 Dlatego 2 zostanie wydrukowany.

+0

Dla pól bitowych 'int' nie musi oznaczać SIGNED. Instrukcja gcc stwierdza: "Standard ISO C pozostawia do wdrożenia to, czy pole bitowe deklarowane jako int zostało podpisane czy nie, co w efekcie tworzy dwa alternatywne dialekty C." Jednak zarówno gcc, jak i MSVC przyjmują go jako podpisany: zobacz http://msdn.microsoft.com/en-US/library/yszfawxh%28v=vs.80%29.aspx i http://gcc.gnu.org/ onlinedocs/gcc-4.1.2/gcc/Non_002dbugs.html. –

Powiązane problemy