Frage
Dies ist auf folgende Frage bezogen,
Wie Deklarieren Sie eine 32-Bit-Integer in C
Mehrere Personen erwähnt int ist immer 32-Bit auf den meisten Plattformen. Ich bin gespannt, ob dies wahr ist.
Sie wissen alle modernen Plattformen mit int einer anderen Größe? Ignorieren Dinosaurier-Plattformen mit 8-Bit- oder 16-Bit-Architekturen.
Hinweis: Ich weiß schon, wie ein 32-Bit-Integer von der anderen Frage zu erklären. Dies ist eher wie eine Umfrage, welche Plattformen (CPU / O / Compiler) unterstützen ganze Zahlen mit anderen Größen zu erfahren.
Lösung
Wie mehrere Leute gesagt haben, gibt es keine Garantie, dass ein ‚int‘ 32 Bit sein wird, wenn Sie Variablen einer bestimmten Größe verwenden wollen, vor allem, wenn das Schreiben von Code, der Bit-Manipulationen beinhaltet, sollten Sie die ‚Standard Integer verwenden Typen von der c99-Spezifikation vorgeschrieben ist.
int8_t
uint8_t
int32_t
uint32_t
etc ...
sie in der Regel in der Form sind [u] intN_t, wo die ‚u‘ gibt an, dass Sie eine nicht signierte Menge wünschen, und N die Anzahl der Bits
die richtigen typedefs für diese sollten in stdint.h verfügbar sein je nachdem, welcher Plattform Sie kompilieren, indem diese ermöglicht es Ihnen, schön, portablen Code zu schreiben: -)
Andere Tipps
"ist immer 32-Bit auf die meisten Plattformen" - was mit diesem Snippet falsch? : -)
Der C-Standard schreibt nicht die Größe vieler seiner integralen Typen. Es hat relative Größen Mandat zum Beispiel sizeof(int) >= sizeof(short)
und so weiter. Er beauftragt auch Mindestbereiche aber ermöglicht, dass mehrere Kodierungsschemata (Zweier-Komplement, einerkomplement und Zeichen / Größe).
Wenn Sie eine bestimmte Größe variabel wollen, müssen Sie eine geeignete für die Plattform verwenden, Sie laufen auf, wie die Verwendung von #ifdef
ist, so etwas wie:
#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
Alternativ C99 und ermöglicht es oben für die genaue Breite Integer-Typen intN_t
und uintN_t
:
- Der Name
typedef
intN_t
bezeichnet einen vorzeichenbehaftete Ganzzahl-Typen mit einer BreiteN
, keine Füllbits und ein Zweierkomplement-Darstellung. Somit bezeichnetint8_t
einen vorzeichenbehaftete Ganzzahl-Typen mit einer Breite von genau 8 Bits. - Der
typedef
NameuintN_t
bezeichnet einen unsigned Integer-Typ mit einer BreiteN
. Somit bezeichnet einenuint24_t
unsigned integer-Typen mit einer Breite von genau 24 Bit. - Diese Typen optional. Wenn jedoch eine Implementierung Integer-Typen mit einer Breite von 8 bereitstellt, 16, 32, oder 64 Bits, keine Füllbits und (für den signierten Typen), die ein Zweierkomplement-Darstellung, so setzt er die entsprechenden
typedef
Namen definieren.
In diesem Moment in der Zeit, die meisten Desktop-und Server-Plattformen verwenden 32-Bit-Integer und sogar viele Embedded-Plattformen (man denke an Handheld-ARM oder x86) verwenden 32-Bit-int
s. Um zu einem 16-Bit int
muss man sehr klein bekommt in der Tat: denken „Berkeley mote“ oder einige der kleineren Atmel Atmega Chips. Aber sie sind da draußen.
Nein. Kleine Embedded-Systeme verwenden 16-Bit-Integer.
Es hängt stark von Ihrem Compiler. Einige kompilieren sie als 64-Bit auf 64-Bit-Maschinen, einige sich als 32-Bit kompilieren. Eingebettete Systeme sind ihre eigene kleine besondere Kugel aus Wachs.
Das Beste, was Sie tun können, um zu überprüfen:
printf("%d\n", sizeof(int));
Beachten Sie, dass sizeof
wird Bytes ausdrucken. Haben sizeof(int)*CHAR_BIT
zu Bits erhalten.
-Code die Anzahl der Bits, die für verschiedene Arten drucken:
#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;
}
Nun, die meisten ARM-basierten Prozessoren Thumb-Code ausführen können, die ein 16-Bit-Modus. Dazu gehören auch die noch-nur gemunkelt Android-Notebooks und die bleeding edge Smartphones.
Auch verwenden einige Grafikrechner 8-Bit-Prozessoren, und ich würde auch diejenigen recht modern nennen.
TI sind noch OMAP Platten mit dem C55x DSPs auf sich zu verkaufen, in erster Linie für die Video-Decodierung verwendet. Ich glaube, die geliefert Compiler für diese eine 16-Bit-int hat. Es ist kaum Dinosaurier (das Nokia 770 im Jahr 2005 veröffentlicht wurde), obwohl Sie 32-Bit-DSPs erhalten können.
Sie Die meisten Code schreiben, können Sie sicher davon ausgehen, es wird nicht immer auf einem DSP ausgeführt werden. Aber vielleicht nicht alle.
Wenn Sie interessieren sich auch für die tatsächliche Max / Min Wert anstelle der Anzahl von Bits, limits.h enthält so ziemlich alles, was Sie wissen wollen.