2015-12-25 19 views
5

O ile mi wiadomo, szerokość typu bool jest definiowana przez implementację. Ale czy istnieją jakieś boolowskie typy o stałej szerokości, czy też powinienem się trzymać, na przykład, uint8_t, aby reprezentować bool o stałej szerokości?Czy istnieje typ bool o stałej szerokości w standardowym C++?

[EDIT] Zrobiłem ten skrypt Pythona, który automatycznie generuje klasę C++, która może przechowywać zmienne, które chcę przesłać między mikrokontrolerem a moim komputerem. Sposób działania polega na tym, że utrzymuje on również dwie tablice zawierające wskaźnik do każdej z tych zmiennych i rozmiar każdego z nich. Daje mi to niezbędne informacje, aby łatwo serializować i deserializować każdą z tych zmiennych. Aby to działało, rozmiar, endianness itp. Typów zmiennych muszą być jednakowe po obu stronach, ponieważ używam tego samego generowanego kodu po obu stronach. Nie wiem, czy to będzie jeszcze jakiś problem, ale nie sądzę, żeby tak było. Już wcześniej pracowałem z tym (32-bitowym układem ARM) i nie miałem problemów z wysyłaniem typów całkowitych i zmiennoprzecinkowych w przeszłości. Jednak minie kilka dni, zanim wrócę i mogę wypróbować booleans na chipie. Może to być później poważniejszy problem, ponieważ kod ten może zostać ponownie wykorzystany w innych procesorach później.

Moje pytanie brzmi. Czy istnieje typ stałej szerokości zdefiniowany w standardowych bibliotekach, czy powinienem użyć uint8_t do reprezentacji boolowskiej?

+2

Typ 'bool' jest ustawiony na' true' i 'false'. W jaki sposób 2 stany mają różną szerokość? –

+0

Czy mówisz o pakowaniu jednego lub więcej boolów w wersji integralnej? –

+1

Czy odwołujesz się do rozmiaru w pamięci? Jeśli tak, to zależy od bool. W 99,9% zajmuje 1 bit, ponieważ reprezentuje on wartość true lub false, on lub off. Jednak pozostałe 7 są nadziewane, nie można ich użyć. Czy to dla ciebie odpowiedź? – Emz

Odpowiedz

3

Nie ma. Po prostu użyj uint8_t, jeśli chcesz mieć pewność co do rozmiaru. Każdy typ liczby całkowitej może być łatwo traktowany jako boolowski w językach związanych z C. Zobacz https://stackoverflow.com/a/4897859/1105015, aby uzyskać długą dyskusję na temat tego, jak rozmiar nie jest gwarantowany przez standard, aby być jakąś określoną wartością.

+3

oczywiście nie ma żadnej niejawnej konwersji na 'bool', kiedy to robisz, więc musisz zachować ostrożność. Na przykład 'uint8_t x = 0x500 & 0x100;' będzie miało wartość "0", ale wartość bool byłaby "prawdziwa" –

+0

@ M.M prawda, ale można to naprawić: 'uint8_t x = 0x500 & 0x100! = 0'. Musisz tylko uważać. –

+1

@MarkRansom ITYM '(0x500 i 0x100)! = 0";) –

Powiązane problemy