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.
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: -)
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
:
- Nazwa
typedef
intN_t
oznacza znakowany Typ liczby całkowitej o szerokościN
, bez bitów dopełniających i reprezentacji dopełniacza dwójki. Tak więcint8_t
oznacza znakowany Typ liczby całkowitej o szerokości dokładnie 8 bitów. - Nazwa
typedef
uintN_t
oznacza typ unsigned integer z szerokośćN
. Tak więcuint24_t
oznacza typ unsigned integer o szerokości dokładnie 24 bitów. - 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
.
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ą.
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.
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;
}
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ż.
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.
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ć.
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