Rozmiar char, int, long double ... może się różnić w zależności od kompilatora. Ale czy mam gwarancję zgodnie ze standardem C++ 11 lub C11, że rozmiar dowolnego podpisanego i niepodpisanego podstawowego typu integralnego jest taki sam?Czy mam gwarancję, że sizeof (type) == sizeof (unsigned type)?
Odpowiedz
C++ 11 standardowych mówi o liczbach całkowitych:
(§3.9.1/3) każdy ze standardowych podpisany typów całkowitych, istnieje odpowiadający (ale inne) stosuje się standardowe typu liczba całkowita bez znaku : "Unsigned char", "unsigned short int", "unsigned int", "unsigned long int" i "unsigned long long int", z których każdy zajmuje taką samą ilość pamięci i ma te same wymagania dotyczące wyrównania (3.11) co odpowiedni podpisany typ całkowity; oznacza to, że każdy typ liczby całkowitej ze znakiem ma taką samą reprezentację obiektu, jak odpowiadający mu typ liczby całkowitej bez znaku. Podobnie, dla każdego z rozszerzonych typów liczb całkowitych ze znakiem istnieje odpowiedni rozszerzony, niepodpisany typ całkowity z taką samą ilością wymagań dotyczących przechowywania i wyrównania. [...]
Odpowiedź brzmi "tak".
Dla C11 jest odpowiedni tu stwierdzenie (to jest z N1570)
(§6.2.5/6) Dla każdego podpisanych typów całkowitych, jest odpowiednia (ale różne) unsigned typu Integer (oznaczone słowem kluczowym unsigned), który wykorzystuje tę samą ilość magazynowania (w tym znak informacyjny) i ma takie same wymagania wyrównanie [...]
Tak, nie ma pełnej gwarancji, że sizeof (typ podpisu) jest równy sizeof (unsigned type) ponieważ niepodpisany przyjmuje tylko przestrzeń ujemną liczby podpisanego typu, aby zwiększyć jej zasięg.
Nic w standardzie nie nakazuje 'UINT_MAX > INT_MAX'; maszyny o jasności znaku mogą je równać. – supercat
- 1. rzeczywistym realizacja gdzie sizeof (size_t) <sizeof (unsigned int)
- 2. Jaki jest sizeof (main), sizeof (printf), sizeof (scanf)?
- 3. C2070 - nielegalne sizeof operand
- 4. Czy jest zagwarantowane, że sizeof (std :: atomic <typ integer>) == sizeof (typ integer)?
- 5. implementacja operatora sizeof
- 6. sizeof o zmiennej liczbie argumentów szablonu (suma wszystkich elementów sizeof)
- 7. zaimplementować własną sizeof
- 8. malloc (sizeof (int)) vs malloc (sizeof (int *)) vs (int *) malloc (sizeof (int))
- 9. SFINAE + sizeof = wykryj, czy wyrażenie kompiluje
- 10. sizeof() a wektor
- 11. sizeof Wskaźnik do tablicy
- 12. sizeof() std :: vector (C++)
- 13. Dlaczego sizeof (void) == 1?
- 14. sizeof() operator dla typów
- 15. sizeof ciąg dosłowne
- 16. Stosując sizeof na typedef zamiast zmiennej lokalnej
- 17. Dlaczego sizeof jest operatorem?
- 18. sizeof a struct member
- 19. Dlaczego jest -1> sizeof (int)?
- 20. Jaka jest różnica między sizeof i alignof?
- 21. Czy niepodpisane słowo kluczowe wpływa na wynik sizeof?
- 22. Czy wymagany jest operator sizeof dla malloc?
- 23. sizeof() część struktury C - sortowanie
- 24. sizeof nie pokazuje oczekiwanego wyjścia
- 25. Python Type System - Object vs Type
- 26. Nowe miejsce docelowe na podstawie szablonu sizeof()
- 27. sizeof (* this) w definicji klasy
- 28. Co oznacza sizeof (int [1])?
- 29. Zachowanie operatora sizeof w C
- 30. "C" sizeof z typem lub zmienną
Mam nadzieję, że tak, chyba że jest jakiś rodzaj, dla którego nierówność ma sens, w takim przypadku chętnie bym to usłyszał. – chris
Tak samo na marginesie, sizeof char ma zawsze postać 1. char może mieć nietypowy rozmiar, na przykład 16 bitów, ale rozmiar sizeof nadal będzie wynosił 1, a rozmiar 32-bitowy będzie wynosił 2. –