2012-08-08 6 views
15

Po prostu w C i warianty (w przeciwieństwie do java wuss z jego maszyną wirtualną) rozmiar pierwotnych typów na różnych celach może się znacznie różnić, a tak naprawdę nie ma gwarancji, chyba że używasz typów o stałej szerokości zdefiniowanych w stdint.h, a nawet wtedy Twoja implementacja musi je wspierać.Czy sizeof zwraca liczbę bajtów lub liczbę oktetów typu w C?

W każdym razie hipotetycznie (ponieważ na większości współczesnych maszyn bajt jest oktetem, dla celów sieciowych zakładam (ASCII)) czy sizeof zwraca rozmiar typu danych w bajtach lub w oktetach?

+3

Bajtów, ale jeden bajt (reprezentowany jako "char") ma bity "CHAR_BITS". Jeśli chcesz liczbę oktetów w 'T', do' sizeof (T) * CHAR_BITS/8'. Na większości platform 'CHAR_BITS' ma wartość' 8'. – GManNickG

+2

@GManNickG 'CHAR_BIT' (nie ma S) :) – Praetorian

+0

float octetPercent = sizeof (T) * CHAR_BIT /8,0; – awiebe

Odpowiedz

16

Odpowiedź: sizeof zwraca rozmiar typu w bajtów.


przykład: sizeof(char) 100% gwarancją 1, ale nie oznacza to, że jeden oktet (8 bitów).


okazały przez standard:

w punkcie 6.5.3.4, 2:

Operator sizeof daje rozmiar (w bajtach) jego operandu, którym może być wyrażenie lub nazwa nawiasów typu. Rozmiar jest określany na podstawie rodzaju argumentu . Wynikiem jest liczba całkowita. Jeśli typ operandu jest typem zmiennej długości tablicy , operand jest oceniany; w przeciwnym razie operand nie jest oceniany, a wynik jest stałą całkowitą .

...

Kiedy stosuje się do argumentu, że jest typu char, unsigned char, lub podpisane char, (lub wykwali fi kowane jego wersję) wynik jest 1. Po zastosowaniu do argumentu, który ma typ tablicy , wynikiem jest całkowita liczba bajtów w tablicy) Po zastosowaniu do argumentu , który ma strukturę lub typ połączenia, wynikiem jest całkowita liczba bajtów w takim obiekcie, w tym dopełnienie wewnętrzne i końcowe.

Również w sekcji 3.6, punkt 3:

Bajt składa się z ciągłej sekwencji bitów, których liczba jest realizacja zdefiniowane

+0

Bardzo dokładny, dziękuję. – awiebe

4

sizeof zawsze zwraca rozmiar jako liczbę bajtów. Ale według wikipedia:

W językach programowania C i C++, to jednoskładnikowa operator sizeof służy do obliczania wielkości dowolnego typu danych, mierzona w liczbie bajtów potrzebnych do reprezentowania typu. Bajt w tym kontekście jest taki sam jak unsigned char, i może być większy niż 8 bitów, chociaż jest to niezbyt często.

6

sizeof podaje rozmiar w bajtach.Należy jednak zauważyć, że "bajt" jest terminem technicznym w standardzie C i jest zdefiniowany tak, że sizeof(char) == 1.

1

Z własnego doświadczenia, pracy na wbudowanych kontrolerów mikro z egzotycznymi kompilatorów 'C', widziałem:

sizeof(uint8) 

powrót 1

sizeof(uint16) 

powrót 1

sizeof(uint32) 

return 2

Najwyraźniej miałem do czynienia z maszyną, która była najmniejsza adresowalna jednostka 16-bitowa, więc rozmiar nie jest zgodny z C89 lub C99.

Powiedziałbym, że w głównych systemach C89 & C99 przyjęta odpowiedź jest prawidłowa. Niestety, kompilator "C" można jeszcze nazwać kompilatorem "C", nawet jeśli nie spełnia on 25-letniego standardu. Mam nadzieję, że ta odpowiedź pomoże spojrzeć na wszystko z perspektywy bardziej egzotycznych systemów.

Powiązane problemy