Czy int w C jest zawsze 32-bitowy?

Jest to związane z następującym pytaniem,

Jak zadeklarować 32-bitową liczbę całkowitą W C

Kilka osób wspomniało, że int jest zawsze 32-bitowy na większości platform. Jestem ciekaw, czy to prawda.

Czy znacie jakieś nowoczesne platformy z int o innej wielkości? Ignoruj platformy dinozaurów z architekturami 8-bitowymi lub 16-bitowymi.

Uwaga: już wiem, jak zadeklarować 32-bitową liczbę całkowitą z drugiego pytania. Ten jest bardziej jak ankieta, aby dowiedzieć się które platformy (CPU/OS/kompilator) obsługują liczby całkowite o innych rozmiarach.

 20
Author: Community, 2009-08-05

8 answers

Jak stwierdziło kilka osób, nie ma gwarancji, że 'int' będzie miał 32 bity, jeśli chcesz używać zmiennych o określonej wielkości, szczególnie podczas pisania kodu, który wymaga manipulacji bitami, powinieneś użyć 'standardowych typów liczb całkowitych' wymaganych przez specyfikację c99.

int8_t
uint8_t
int32_t
uint32_t

Itd...

Mają zazwyczaj postać [u] intN_t, gdzie "u" określa, że chcesz mieć niepodpisaną Ilość, A N jest liczbą bitów

Poprawny typ dla tych powinien być dostępny w wersji stdint.h na dowolnej platformie, dla której kompilujesz, za pomocą nich możesz napisać ładny, przenośny Kod: -)

 40
Author: David Claridge,
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
2009-08-05 06:06:36

"jest zawsze 32-bit on najbardziej platformy" - co jest nie tak z tym fragmentem? :-)

Norma C nie nakazuje rozmiarów wielu jej typów całkowych. To Nie nakazuje względne rozmiary, na przykład sizeof(int) >= sizeof(short) i tak dalej. Wymaga również minimalnych zakresów, ale pozwala na stosowanie wielu schematów kodowania(dopełniacz dwóch, dopełniacz jednego i znak / wielkość).

Jeśli chcesz mieć określoną zmienną wielkości, musisz użyć jednej na przykład, jeśli używasz platformy #ifdef ' S, coś w stylu:

#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

Alternatywnie, C99 i powyżej pozwala na dokładne typy szerokości całkowitej intN_t i uintN_t:


  1. Nazwa typedef intN_t oznacza znakowany Typ liczby całkowitej o szerokości N, bez bitów dopełniających i reprezentacji dopełniacza dwójki. Tak więc int8_t oznacza znakowany Typ liczby całkowitej o szerokości dokładnie 8 bitów.
  2. Nazwa typedef uintN_t oznacza typ unsigned integer z szerokość N. Tak więc uint24_t oznacza typ unsigned integer o szerokości dokładnie 24 bitów.
  3. te typy są opcjonalne. Jednakże, jeśli implementacja udostępnia typy całkowite o szerokości 8, 16, 32 lub 64 bitów, bez wypełniania bitów i (dla typów podpisanych), które mają reprezentację dopełniacza dwójki, definiuje ona odpowiednie nazwy typedef.
 15
Author: paxdiablo,
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
2018-06-01 01:59:04

W tej chwili większość platform desktopowych i serwerowych używa 32-bitowych liczb całkowitych, a nawet wiele wbudowanych platform (Handheld ARM lub x86) używa 32-bitowych int s. aby dostać się do 16-bitowego int, musisz być naprawdę bardzo mały: pomyśl "Berkeley mote" lub niektóre mniejsze chipy Atmel Atmega. Ale oni tam są.

 6
Author: Norman Ramsey,
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
2009-08-05 05:54:17

Nie. Małe systemy wbudowane używają 16-bitowych liczb całkowitych.

 3
Author: starblue,
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
2009-08-05 05:16:51

To zależy od Twojego kompilatora. Niektóre kompilują je jako 64-bitowe na 64-bitowych maszynach, niektóre kompilują je jako 32-bitowe. Systemy wbudowane to ich własna mała, specjalna kulka wosku.

Najlepsze co możesz zrobić, aby sprawdzić:

printf("%d\n", sizeof(int));

Zauważ, że sizeof wydrukuje bajty. Do sizeof(int)*CHAR_BIT, aby uzyskać bity.

Kod do wypisania liczby bitów dla różnych typów:

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}
 2
Author: Eric,
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
2009-08-05 04:25:40

Cóż, większość procesorów opartych na ARM może uruchamiać kod kciuka, który jest trybem 16-bitowym. Obejmuje to notebooki z Androidem i najnowsze smartfony.

Ponadto, niektóre kalkulatory graficzne używają 8-bitowych procesorów, i nazwałbym te dość nowoczesne, jak również.

 1
Author: Christoffer,
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
2009-08-05 07:17:02

TI nadal sprzedaje płyty OMAP z DSP C55x na nich, używane głównie do dekodowania wideo. Wydaje mi się, że dostarczony kompilator ma 16-bitowy int. To raczej dinozaur (Nokia 770 została wydana w 2005 roku), chociaż można dostać 32 bitowe DSP.

Większość kodu, który piszesz, można bezpiecznie założyć, że nigdy nie będzie uruchamiany NA DSP. Ale może nie wszystkie.

 1
Author: Steve Jessop,
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
2009-08-05 12:40:37

Jeśli interesuje Cię również rzeczywista wartość Max / Min zamiast liczby bitów, limity.h zawiera prawie wszystko, co chcesz wiedzieć.

 0
Author: Michael Stum,
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
2009-08-05 12:22:41