Forum: Compiler & IDEs short != int16_t


von long (Gast)


Lesenswert?

Hallo,

ich meinem Code verwende ich int16_t, damit habe ich eine Stoppuhr. 
Diese zählt einmal werte positiv und dann auch negativ.

Ich verwende int16_t was auch soweit funktioniert. Nun gewöhne ich mir 
eine andere Schreibweise an und wollte es mit short machen. Doch nun 
zählt er nur positiv aber nicht negativ.

Ist short also nicht das gleiche wie int16_t ??

von Helfer (Gast)


Lesenswert?

Welcher Code? Ich sehe keinen Code :(

von long (Gast)


Lesenswert?

in der stdint.h steht:

/** \ingroup avr_stdint
    8-bit signed type. */

typedef signed char int8_t;

/** \ingroup avr_stdint
    8-bit unsigned type. */

typedef unsigned char uint8_t;

/** \ingroup avr_stdint
    16-bit signed type. */

typedef signed int int16_t;

/** \ingroup avr_stdint
    16-bit unsigned type. */

typedef unsigned int uint16_t;


short ist also int!

von Floh (Gast)


Lesenswert?

long schrieb:
> Ich verwende int16_t was auch soweit funktioniert. Nun gewöhne ich mir
> eine andere Schreibweise an und wollte es mit short machen.

Nimm lieber die Schreibweise int16_t. Da weist du wenigstens genau, was 
du hast, wärend short / short int von der Implementation des Compilers 
und dem Zielprozessor abhängt.
:-)

von 2ter Gast (Gast)


Lesenswert?

Man brauch keinen code. Ob bei deinem Compiler short == int ist, sagt 
dir das manual.

Es ist aber  aus portabilitäts Gründen besser bei int16_t, uint16_t usw 
zu bleiben. Nimm z.B. den Wertebereich Datentyp int:
- 8051: -32768 bis 32767
- "PC": −2.147.483.648   bis 2.147.483.647

von Helfer (Gast)


Lesenswert?

Nach allen Infos im Thread bisher ist die Beobachtung des TO für mich 
unverständlich. Es wäre interessant das betreffende Codestück zu sehen, 
um den Effekt zu reproduzieren oder zu falsifizieren.

von Art Ickel aus W. (Gast)


Lesenswert?

> Nimm z.B. den Wertebereich Datentyp int:
> - 8051: -32768 bis 32767
> - "PC": −2.147.483.648   bis 2.147.483.647

Bei den PIC CCS Compiler kann man int auch auf 8 Bit, also -128 .. +127 
einstellen. Ich glaube sogar, das war die Default Einstellung.

Und wie ist's bei ner 64 Bit Maschine ?

von Herbert Hebert (Gast)


Lesenswert?

long schrieb:
> short ist also int!

Nein.
char = 8 Bit.
int = 16 Bit.
(short) int = 8 Bit.

von Glaskugel (Gast)


Lesenswert?

Situation:

1. Unklar, warum die Schreibweise "short" der Schreibweise "int16_t" 
vorgezogen werden soll.
2. Post mit Auszug von stdint.h in 
Beitrag "Re: short != int16_t" gibt keine Basis für 
die Schlussfolgerung das "short" das selbe wie "int" ist. Insbesondere 
wird durch den Auszug aus stdint.h nicht geklärt ob "short" wie "int" 
vorzeichenbehaftet ist.

Information:
1. "short" ist als "int"-Typ vorzeichenbehaftet. Siehe: 
http://de.wikipedia.org/wiki/C_%28Programmiersprache%29#Basisdatentypen 
und 
http://openbook.galileocomputing.de/c_von_a_bis_z/005_c_basisdatentypen_006.htm#mjbac145b7d1ec17dbb4096f2a1c1a616b 
sowie deren Referenz 
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf Seite 22 und 
andere.

von Jörg H. (dr_coolgood)


Lesenswert?

Dieser Thread ist ein weiterer beeindruckender Beweis, warum (u)intxx_t 
soviel eindeutiger sind - auf jedem Compiler und auf jeder CPU!

von (prx) A. K. (prx)


Lesenswert?

Herbert Hebert schrieb:

> (short) int = 8 Bit.

In Standard-C hat short mindestens 16 Bits und hat selbstredend ein 
Vorzeichen. stdint.h hilft dabei nicht sehr, limits.h und dessen 
ANSI-Vorgabe hingegen schon.

von Art Ickel aus W. (Gast)


Lesenswert?

short ist nicht länger als long ...

... mehr aber auch nicht.

von DirkB (Gast)


Lesenswert?

@long

Woher weißt du, das dein short nur positiv zählt?

von Rolf Magnus (Gast)


Lesenswert?

Um hier mal die Rätselraterei abztustellen  ("int 8 bit?", "short ohne 
Vorzeichen?", "short größer als int?"):

In ISO-C ist gibt es folgende Integer-Typen:

char
short
int
long
long long

Die gibt es jeweils mit und ohne Vorzeichen. Außer char hat jeder dieser 
Typen ein Vorzeichen, wenn kein "unsigned" davor steht. Bei char ist es 
Compiler-spezifisch, ob es ohne weitere Angabe mit oder ohne Vorzeichen 
ist.

Es gilt
sizeof(char) = 1
sizeof(short) >= sizeof(char)
sizeof(int) >= sizeof(short)
sizeof(long) >= sizeof(int)
sizezof(long long) >= sizeof(long)

Außerdem muß char mindestens 8 Bit breit sein, short und int mindestens 
16 Bit, long mindestens 32 Bit und long long mindestens 64 Bit. Diese 
Anforderung steht zwar nicht direkt so in der ISO-Norm, ergibt sich aber 
aus den Anforderungen an die mindestens zu untersütztenden Wertebereiche 
dieser Typen.
Alles, was von den obigen Bedingungen abweicht, verstößt gegen die 
ISO-C-Spezifikation.

Floh schrieb:
> long schrieb:
>> Ich verwende int16_t was auch soweit funktioniert. Nun gewöhne ich mir
>> eine andere Schreibweise an und wollte es mit short machen.
>
> Nimm lieber die Schreibweise int16_t. Da weist du wenigstens genau, was
> du hast,

Sofern es wirklich unbedingt exakt 16 Bit sein müssen und auf gar keinen 
Fall mehr sein dürfen. Ansonsten wäre je nach Anforderung int_fast16_t 
oder int_least16_t vorzuziehen.

Art Ickel aus W. schrieb:
>> Nimm z.B. den Wertebereich Datentyp int:
>> - 8051: -32768 bis 32767
>> - "PC": −2.147.483.648   bis 2.147.483.647
>
> Bei den PIC CCS Compiler kann man int auch auf 8 Bit, also -128 .. +127
> einstellen. Ich glaube sogar, das war die Default Einstellung.

Bei avr-gcc kann man das auch so einstellen, vor allem, weil der 
Compiler hier ein paar Defizite bei der Optimierung hat. Es wird aber 
trotzdem selten verwendet, da es mehr Probleme verursacht als es löst. 
Es ist wie gesagt auch nicht konform.

> Und wie ist's bei ner 64 Bit Maschine ?

Unterschiedlich. Nach ISO C sollte (muß aber nicht) int 64 Bit breit 
sein, da das die native Wortbreite der Maschine ist. Das wird aber in 
der Regel nicht gemacht, da einem dann nach unten hin die Typen 
ausgehen. Man will ja auch 8, 16, und 32 Bit haben, hat aber nur zwei 
Typen, die kleiner als int sein dürfen, nämlich char und short. Deshalb 
ist int dort in der Regel auch 32 Bit, short 16 Bit und char 8 Bit. Bei 
long gibt es dann Unterschiede. Auf manchen 64-Bit-Systemen ist long 32 
Bit breit, auf anderen 64 Bit. Ob es bei letzteren auch üblich ist, long 
long 128 Bit breit zu machen, ist mir allerdings nicht bekannt.

von Klaus (Gast)


Lesenswert?

long schrieb:
> Ich verwende int16_t was auch soweit funktioniert. Nun gewöhne ich mir
> eine andere Schreibweise an und wollte es mit short machen. Doch nun
> zählt er nur positiv aber nicht negativ.

Bleib bei int16_t - dein Code bleibt dadurch wesentlich portierbarer.
Falls es nicht auf die Größe ankommt ist es natürlich effizient die für 
die Plattform günstige Größe zu nehmen. Sollte man sich dann sowas wie 
uintstd_t und intstd_t definieren, mit der Vereinbarung dass diese auf 
jeder Plattform mindestens 16-bit hat.

von Vlad T. (vlad_tepesch)


Lesenswert?

Klaus schrieb:
> Bleib bei int16_t - dein Code bleibt dadurch wesentlich portierbarer.
> Falls es nicht auf die Größe ankommt ist es natürlich effizient die für
> die Plattform günstige Größe zu nehmen. Sollte man sich dann sowas wie
> uintstd_t und intstd_t definieren, mit der Vereinbarung dass diese auf
> jeder Plattform mindestens 16-bit hat.

dafür gibt es doch die fast typen
uint16_fast_t zB
muss mindestens uint16_t sein kann aber größer sein, wenn dies schneller 
auf der Zielplatform ist.

von Rolf Magnus (Gast)


Lesenswert?

Hab ich ja schon geschrieben. Eigentlich ist das sogar portabler, wenn's 
auch in der Praxis selten eine Rolle spielt. Wenn es auf dem 
Zielcompiler keinen 16-Bit-Typ gibt, dann gibt es da nämlich auch keinen 
uint16_t, aber einen uint_fast16_t gibt's.

von DirkB (Gast)


Lesenswert?

Wie gebe ich denn die stdint-Variablen mit printf aus, wenn ich nicht 
genau weiß wie groß diese sind?

Casting nach long, oder gibt es eine bessere Möglichkeit?

von Guru (Gast)


Lesenswert?

In inttypes.h sind Definition für Format-Spezifizierer der in stdint 
definierte Typen enthalten.

Z.B. für printf:

/** \ingroup avr_inttypes
    decimal printf format for int8_t */
#define    PRId8      "d"

Siehe auch: 
http://openbook.galileocomputing.de/c_von_a_bis_z/005_c_basisdatentypen_007.htm#mjdc3fe710a0f3af27e81228931f8e6bcb

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.