Wat is de beste manier om een integer type te declareren dat altijd 4 byte is op alle platforms? Ik maak me geen zorgen over bepaalde apparaten of oude machines die 16-bits int
hebben.
Antwoord 1, autoriteit 100%
#include <stdint.h>
int32_t my_32bit_int;
Antwoord 2, autoriteit 12%
C houdt zich niet veel bezig met de exacte grootte van integer-types, C99 introduceert de header stdint.h, wat waarschijnlijk de beste keuze is. Voeg dat toe en u kunt b.v. int32_t
. Natuurlijk ondersteunen niet alle platforms dat.
Antwoord 3, autoriteit 10%
Corey’s antwoord is correct voor “best”, naar mijn mening, maar een simpele “int” zal in de praktijk ook werken (aangezien je systemen met 16-bits int negeert). Op dit moment hangt zoveel code ervan af dat het 32-bit is dat systeemverkopers het niet gaan veranderen.
(Bekijk ook waarom lang 32-bits is op veel 64-bits systemen en waarom we “lang lang” hebben.)
Een van de voordelen van het gebruik van int32_t is echter dat u dit probleem niet in stand houdt!
Antwoord 4, autoriteit 4%
Je zou een kopie van brg_types.h
van Brian Gladman kunnen vinden als je stdint.h
niet hebt.
brg_types.h
zal de grootte van de verschillende gehele getallen op je platform ontdekken en zal typedefs maken voor de gebruikelijke groottes: 8, 16, 32 en 64 bits.
Antwoord 5, autoriteit 3%
C99 of hoger
Gebruik <stdint.h>
.
Als uw implementatie de complementaire 32-bits gehele getallen van 2 ondersteunt, moet deze int32_t
definiëren.
Zo niet, dan is int_least32_t
het beste dat een geheel getal is dat door de implementatie wordt ondersteund en dat ten minste 32 bits is, ongeacht de representatie (twee-complement, één-complement, enz.).
Er is ook int_fast32_t
, een integer-type van ten minste 32 bits breed, gekozen met de bedoeling de snelste bewerkingen voor die vereiste grootte mogelijk te maken.
ANSI C
U kunt long
gebruiken, wat gegarandeerd minimaal 32-bits breed is als gevolg van de minimale bereikvereisten die door de standaard worden gespecificeerd.
Als u liever het kleinste gehele type gebruikt om in een 32-bits getal te passen, dan kunt u preprocessor-statements zoals de volgende gebruiken met de macro’s gedefinieerd in <limits.h>
:
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX
Antwoord 6
Als stdint.h niet beschikbaar is voor uw systeem, maak er dan zelf een. Ik heb altijd een bestand met de naam “types.h” met typedefs voor alle ondertekende/niet-ondertekende 8, 16 en 32 bit-waarden.
Antwoord 7
ook afhankelijk van uw doelplatforms kunt u autotools gebruiken voor uw bouwsysteem
het zal zien of stdint.h/inttypes.h bestaat en als dat niet het geval is, zal het geschikte typedefs maken in een “config.h”
Antwoord 8
stdint.h ligt voor de hand, maar is niet per se beschikbaar.
Als u een draagbare bibliotheek gebruikt, is het mogelijk dat deze al overdraagbare gehele getallen met een vaste breedte biedt.
SDL heeft bijvoorbeeld Sint32
(S is voor “ondertekend”) en GLib heeft gint32
.
Antwoord 9
U kunt 32 bits declareren met ondertekend of niet-ondertekend lang.
int32_t variable_name;
uint32_t variable_name;