Dwukropki po nazwie zmiennej w C [duplikat]

to pytanie ma już odpowiedzi tutaj : Zamknięte 10 lat temu .

Możliwy duplikat:
co oznacza dwukropek w deklaracji struct, np. :1, :7, :16 lub :32?

To jest próbka kodu C z strona referencyjna.

      signed int _exponent:8;

Jakie jest znaczenie dwukropka przed " 8 "i samego "8"?

Author: S.S. Anne, 2010-10-21

4 answers

To bitfield. Jest ona ważna tylko w definicji struct i oznacza to, że system będzie używał tylko 8 bitów dla Twojej liczby całkowitej.

 27
Author: EboMike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 20:17:15

Jest to bitfield, niejasna i błędna cecha struktur. To powinno wystarczyć, aby wyszukać informacje potrzebne do radzenia sobie z bitfieldami w kodzie innych ludzi. Jeśli chodzi o własny kod, nigdy nie używaj bitfieldów.

Edit: Jak zażądał Zack, pola bitowe mają znaczące wady w porównaniu z wykonywaniem własnej arytmetyki bitowej i nie mają żadnych zalet. Oto niektóre z nich:

  • możesz kopiować, porównywać, serializować lub deserializować tylko jedno pole bitowe element na raz. Wykonując własną arytmetykę bitową, możesz operować na całych słowach naraz.
  • nigdy nie można mieć wskaźnika do elementów bitfield. Dzięki własnej arytmetyce bitowej możesz mieć wskaźnik do większego słowa i indeks bitowy w słowie jako "wskaźnik".
  • bezpośrednie odczytywanie / zapisywanie struktur C na dysk lub sieć jest w połowie przenośne bez bitfieldów, o ile używasz typów o stałych rozmiarach i znasz endianness. Dorzucić bitfieldy, a kolejność elementów w ramach większego typu, jak również całkowitej przestrzeni użytej i wyrównania, stają się wysoce zależne od implementacji, nawet w obrębie danej architektury procesora.
  • Specyfikacja C ma bardzo dziwne zasady, niż pozwalają na to, że znakowanie elementów bitfield różni się od tego, czego można się spodziewać, i bardzo niewiele osób jest tego świadomych.

Dla FLAG jednobitowych używanie własnej arytmetyki bitowej zamiast bitfieldów jest całkowicie bezmyślne. Dla większych wartości należy spakować, jeśli jest zbyt bolesne wypisanie całej arytmetyki bitowej na całym miejscu, napisać kilka prostych makr.

 17
Author: R.. GitHub STOP HELPING ICE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-21 03:22:11

Jest to Specyfikacja bitfield .

Oznacza to, że _exponent pobiera tylko 8 bity z signed int, co zwykle zajmuje więcej niż 8 bitów. Zazwyczaj pola bitowe są używane z typami niepodpisanymi.

IIRC, kompilator ostrzegałby, jeśli coś, co nie mieści się w 8-bitach, zostanie zapisane w _exponent.

 3
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-21 02:59:22

Gdy to polecenie znajduje się wewnątrz struktury, oznacza pola bitowe .

 2
Author: karlphillip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-21 02:56:37