Czy C i C++ gwarantują, że niepodpisany odpowiednik typu ma taki sam rozmiar?Czy niepodpisane słowo kluczowe wpływa na wynik sizeof?
Przykład:
size_t size = sizeof(unsigned int);
Czy unsigned
całkowicie dyskusyjna tutaj?
Czy C i C++ gwarantują, że niepodpisany odpowiednik typu ma taki sam rozmiar?Czy niepodpisane słowo kluczowe wpływa na wynik sizeof?
Przykład:
size_t size = sizeof(unsigned int);
Czy unsigned
całkowicie dyskusyjna tutaj?
Oba języki gwarantują, że podpisane i niepodpisane warianty odpowiedniego standardowego typu liczb całkowitych mają ten sam rozmiar.
C++ projekt komitetu n3337, 3.9.1/3:
3 Dla każdego ze standardowych podpisany typów całkowitych, istnieje odpowiadający (ale inny) średnia nieposkromioną podpisany typ całkowity „unsigned char "," unsigned short int "," unsigned int "," unsigned long int ", i" unsigned long long int ", , z których każda zajmuje taką samą ilość pamięci i ma takie same wymagania wyrównania (3.11) jako odpowiednia liczba całkowita ze znakiem, typ 45; to znaczy, że każdy podpisany typ całkowity ma taką samą reprezentację obiektu, co odpowiadający mu typ liczby całkowitej bez znaku. [...]
dla C, brzmienie jest bardzo podobna Zrobione z projektów n1570
, 6.2.5/6:
Dla każdego z typów całkowitych podpisane, istnieje odpowiedni (ale inny) unsigned typ całkowity (oznaczony słowem kluczowym unsigned) , który używa tej samej ilości pamięci (w tym informacji o znaku) i ma takie same wymagania dotyczące wyrównania. Typy typu _Bool i niepodpisane liczby całkowite, które odpowiadają standardowym typom liczby całkowitej ze znakiem, są typowymi liczbami całkowitymi bez znaku. Niepodpisane typy całkowite, które odpowiadają , odpowiadają rozszerzonym typom liczb całkowitych ze znakiem, są rozszerzonymi bez znaku typami całkowitymi. Standardowe i rozszerzone typy liczb całkowitych bez znaku są zbiorczo nazywane rodzajami całkowitymi bez znaku .
Doskonała odpowiedź, miło zobaczyć faktyczne cytowanie. –
Początkowe "tak" w twojej odpowiedzi jest mylące, ponieważ OP sformułował temat pytania i pierwszą linię ciała pytania w odwrotnej kolejności. :-) –
Zgadzam się @R. Lepiej teraz? – jrok
To naprawdę nie jest przestarzałe, bardziej jak zbędne. Standard gwarantuje, że podpisane i niepodpisane odmiany danego typu mają taką samą wielkość.
Zawsze możesz umieścić w jakimś kodzie jak tego
{
char s1[1 + sizeof(int) - sizeof(unsigned int)];
char s2[1 + sizeof(unsigned int) - sizeof(int)];
}
(prawdopodobnie tylko w debugowania buduje)
To daje czas kompilacji niepowodzenie, gdyby kiedykolwiek różne rozmiary.
Robię to od czasu do czasu dla wysoce (typedef) ed kodu jestem refactoring.
Jednak nie podpisane i podpisane odmiany mają zawsze ten sam rozmiar.
'assert (sizeof (signed int) == sizeof (unsigned int))' dokonuje tego samego z większą czytelnością. –
Ale czy to nie jest awaria w czasie wykonywania? Chcę zablokować kompilację! – Bathsheba
Dla C++ 11 możesz użyć ['std :: static_assert (sizeof (signed int) == sizeof (unsigned int)," size mismatch ");'] (http://en.cppreference.com/w/ cpp/language/static_assert), aby uzyskać błąd czasu kompilacji. –
Chociaż jest zbędne, myślę, że zalecane jest użycie 'sizeof (unsigned int)' jeśli chodzi o spację dla 'unsigned int', aby uniknąć nieporozumień. – zch
Jeśli chodzi o psychologię - chcesz mieć rozmiar X (cokolwiek X) - po prostu bądź wyraźny.Wtedy programowanie zawsze będzie słuszne, niezależnie od X - (unsigned int, klasa Kapusta ...) –
Byłbym zdziwiony, gdyby sizeof (int) nigdy nie był równy sizeof (unsigned). Polecam trust-but-verify. – matthudson