Ich bin gekommen, um eine Variable vom Typ zu verwenden uint16_t
, aber ich kann diesen Datentyp aufgrund meiner Projektbeschränkungen nicht verwenden. Ist es möglich, zu unsigned short int
Anstatt von uint16_t
? Ich kenne den Unterschied zwischen den beiden nicht. Könnte jemand bitte klären?
Was ist der Unterschied zwischen uint16_t und unsigned short int bei einem 64-Bit-Prozessor?
China
Yu Hao
uint16_t
ist eine vorzeichenlose 16-Bit-Ganzzahl.
unsigned short int
ist eine kurze ganze Zahl ohne Vorzeichen, aber die Größe ist implementierungsabhängig. Der Standard sagt nur, dass es mindestens 16-Bit ist (d. h. Mindestwert von UINT_MAX
ist 65535
). In der Praxis ist es meist 16-Bit, aber das kann man nicht als Garantie nehmen.
Notiz:
- Wenn Sie eine portable 16-Bit-Ganzzahl ohne Vorzeichen wünschen, verwenden Sie
uint16_t
. inttypes.h
undstdint.h
werden beide in C99 eingeführt. Wenn Sie C89 verwenden, definieren Sie Ihren eigenen Typ.uint16_t
kann in bestimmten Implementierungen nicht bereitgestellt werden (siehe Referenz unten), aberunsigned short int
ist immer verfügbar.
Referenz: C11 (ISO/IEC 9899:201x) §7.20 Ganzzahlige Typen
Für jeden hierin beschriebenen Typ, den die Implementierung bereitstellt, soll dieser Typedef-Name deklariert und die zugehörigen Makros definiert werden. Umgekehrt soll für jeden hierin beschriebenen Typ, den die Implementierung nicht bereitstellt, weder der Typedef-Name deklariert noch die zugehörigen Makros definiert werden. Eine Implementierung muss die als „erforderlich“ beschriebenen Typen bereitstellen, muss aber keine der anderen bereitstellen (als „optional“ beschrieben).
-
Im Prinzip können einige Implementierungen (und ABI) Nicht-16-Bit-Shorts haben. In der Praxis haben alle üblichen 64-Bit-Prozessoren und ABI (x86-64, Sparc 64, PowerPC 64, Aarch 64) 16-Bit-Shorts. Aber
int
-s sind normalerweise 32 Bit.– Basile Starynkevitch
17. Juli 2013 um 7:17 Uhr
-
Auch ich habe noch nie einen 64-Bit-Rechner gesehen, der 32-Bit-Shorts hatte.
– Casey
17. Juli 2013 um 7:17 Uhr
-
Betrachten Sie als Randnotiz eine Implementierung, in der
short int
s sind größer als 16 Bit undCHAR_BIT
8 ist (was fast immer der Fall ist), dann wäre es einfach unmöglich definierenuint16_t
AFAICT.– mtvec
17. Juli 2013 um 7:50 Uhr
-
@Job Es ist nicht unmöglich. Der Compiler könnte (als Erweiterung) so etwas wie bereitstellen
__uint16_t
undstdint.h
enthalten könntetypedef __uint16_t uint16_t
.– glglgl
17. Juli 2013 um 8:32 Uhr
-
@glglgl: Du hast Recht, ich habe nicht an erweiterte Integer-Typen gedacht.
– mtvec
17. Juli 2013 um 9:03 Uhr
Scott Chamberlain
uint16_t
ist garantiert eine vorzeichenlose ganze Zahl, die 16 Bit groß ist
unsigned short int
ist garantiert unsigniert short integer
wo short integer
wird durch den Compiler (und möglicherweise Compiler-Flags) definiert, den Sie derzeit verwenden. Für die meisten Compiler für x86-Hardware a short integer
ist 16 Bit groß.
Beachten Sie auch, dass pro dem ANSI-C-Standard nur die minimale Größe von 16 Bit ist definiert, die maximale Größe liegt beim Entwickler des Compilers
Minimale Typenbeschränkungen
Jeder Compiler, der dem Standard entspricht, muss auch die folgenden Einschränkungen in Bezug auf den Wertebereich einhalten, den ein bestimmter Typ akzeptieren kann. Beachten Sie, dass dies niedrigere Grenzwerte sind: Eine Implementierung kann einige oder alle dieser Grenzwerte überschreiten. Beachten Sie auch, dass der Mindestbereich für ein Zeichen davon abhängt, ob ein Zeichen als signiert oder nicht signiert betrachtet wird.
Geben Sie Mindestbereich ein
signed char -127 to +127 unsigned char 0 to 255 short int -32767 to +32767 unsigned short int 0 to 65535
Haben Sie versucht, nach typedef unsigned short uint16_t zu suchen?
– Ismeet
17. Juli 2013 um 7:14 Uhr
@Ishmeet Ich habe im Falle eines 64-Bit-Prozessors keine Informationen gefunden
– China
17. Juli 2013 um 7:14 Uhr
@Ishmeet Ich portiere Code von einem Prozessor auf einen anderen und habe ihn gefunden
– China
17. Juli 2013 um 7:18 Uhr
Dass der Prozessor 64 Bit ist, ist nicht genug Information, wichtig ist die ABI, die für Ihre Plattform implementiert ist. Dies ist von Prozessor zu Prozessor und von Betriebssystem zu Betriebssystem unterschiedlich. Und tatsächlich ist die Kategorisierung eines Prozessors als 64-Bit (oder nicht) eine zu starke Vereinfachung, die für diese Art von Fragen nicht sehr hilfreich ist.
– Jens Gustedt
17. Juli 2013 um 7:18 Uhr
Ich habe einmal Programme für eine Plattform geschrieben, deren Compiler es nicht gab
uintXX_t
. Also habe ich sie selbst geschrieben. Das hat geholfen, obwohl es nicht sehr sauber war (weiß nicht, ob ich das nach den C-Normen darf).– glglgl
17. Juli 2013 um 8:34 Uhr