Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem in AVR C Syntax


von Franz (Gast)


Lesenswert?

Hallo zusammen,

habe ein kleines Verständnisproblem mit AVR C.
Schreibe Programme in Bascom und möchte auf AVR Studio umsteigen.

Und zwar verstehe ich folgendes nicht so richtig:

a = 0x10000F23
a = (a << 3)

Was passiert hier genau und was steht danach in der Variablen a?
Wird danach nur Bit 3 der hexadezimalen Zahl von a in a stehen?

VG
Franz

: Gesperrt durch Moderator
von c-hater (Gast)


Lesenswert?

Franz schrieb:

> Und zwar verstehe ich folgendes nicht so richtig:
>
> a = 0x10000F23
> a = (a << 3)
>
> Was passiert hier genau

Nichts. Außer einer mehr oder weniger kryptischen Fehlermeldung des 
Compilers. Da fehlen Semikolons...

> und was steht danach in der Variablen a?

Na was schon: 0x10000F23 << 3, also 0x80007918. Wie das dann 
interpretiert wird, hängt vom Typ ab, mit dem a deklariert ist.

von Wolfgang (Gast)


Lesenswert?

Franz schrieb:
> a = (a << 3)
> Was passiert hier genau

Vermutlich das gleiche, wie wenn du in BASCOM schreibst
1
SHIFT a, LEFT, 3

von kannAllesBesser! (Gast)


Lesenswert?

c-hater schrieb:
> also 0x80007918

nee! aber besser 0x8007918

von kannAllesBesser! (Gast)


Lesenswert?

kannAllesBesser! schrieb:
> nee! aber besser 0x8007918

nehme alles zurück! war eine null zu wenig

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Franz schrieb:
> AVR C.
Es gibt keine spezielles "AVR C":-)

Das sind ganz normale basics der Programiersprache C/C++ die überall 
gelten und die man daher schon kennen sollte wenn man diese Sprache 
nutzen will.

https://en.cppreference.com/w/c/language/operator_arithmetic
-> Shift operators

von c-hater (Gast)


Lesenswert?

Irgend W. schrieb:

> Das sind ganz normale basics der Programiersprache C/C++ die überall
> gelten und die man daher schon kennen sollte wenn man diese Sprache
> nutzen will.

Na wo kommen wir denn da hin? Man soll die Sprache lernen, bevor man sie 
benutzt? Das geht ja mal garnicht, das macht ja Arbeit und erfordert 
eigene Denkleistung...

Nö, das ist nicht mehr zeitgemäß...

von Stefan F. (Gast)


Lesenswert?

Franz schrieb:
> Was passiert hier genau und was steht danach in der Variablen a?

> a = 0x10000F23
Das ist eine Zuweisung. Hier wird der angegebene Zahlenwert in die 
Variable a gespeichert. Wobei das "0x" die Zahl als hexadezimal-Zahl 
kennzeichnet.

0x10000F23 (hexadezimal) = 268439331 (dezimal) = 
0b10000000000000000111100100011 (binär)

> a = (a << 3)

Das ist eine Schiebe-Operation. Alle Bits werden 3x nach links 
geschoben.
1
Anfangswert      ---10000000000000000111100100011
2
1x Schieben      --10000000000000000111100100011-
3
2x Schieben      -10000000000000000111100100011--
4
3x Schieben      10000000000000000111100100011---

Die mit "-" gekennzeichneten Lücken werden mit 0 gefüllt.

von Einer K. (Gast)


Lesenswert?

Franz schrieb:
> a = 0x10000F23
> a = (a << 3)



1
unsigned long a;
2
a = 0x10000F23; // 0b0000010000000000000000111100100011
3
a <<= 3;        // 0b0010000000000000000111100100011000



Tipp:
Wenn man wissen möchte, was ein Ausdruck tut, dann schaut man sich die 
Sprach Definition an. Alternativ, beschafft sich ein gutes Buch, welches 
einem die Sprache erklärt.
Hier sollte jedes C oder C++ Grundlagenbuch geeignet sein.
Egal wie alt.

Dann probiert man das aus....
Aus dem Buch weiß man ja schon, was herauskommen sollte, und wenn es 
dann wirklich genau so herauskommt, dann besteht die Hoffnung, dass man 
ein klein wenig des Buches, der Sprache, verstanden hat.

von Franz (Gast)


Lesenswert?

Danke, an die mehr oder weniger konstruktiven Antworten!
Das hat mir weitergeholfen.

In Zusammenhang mit dem Codeschnippsel, den ich aus einem Programm 
hatte, war ich als Gelegenheitsprogrammierer auf dem Holzweg und stand 
gleichzeitig noch auf dem Schlauch.

Es ging um das Beschreiben des 32 Bit CAN Registers CANIDT im 
AT90CAN128. Darin sind die nur die oberen 29 Bit beschrieben, weshalb 
die ID um 3 Bit nach links geshiftet werden muss. Das wurde mir jetzt 
erst durch eure Hilfe und nach dem Wälzen des Datenblattes bewusst.

Mit der Bascom Bibliothek war das Shiften nicht notwendig.

VG
Franz

von Nick M. (Gast)


Lesenswert?

Franz schrieb:
> Es ging um das Beschreiben des 32 Bit

Dann gewöhn dir bitte gleich an statt 'unsigned long' uint32_t zu 
schreiben.
Unsigned long ist nämlich nicht genau definiert da plattformabhängig.
Es ist einfach schlechter Stil.

von Franz (Gast)


Lesenswert?

Perfekt, danke für den Hinweis!
Hatte ich bereits so umgesetzt.

von Einer K. (Gast)


Lesenswert?

Nick M. schrieb:
> Dann gewöhn dir bitte gleich an statt 'unsigned long' uint32_t zu
> schreiben.
> Unsigned long ist nämlich nicht genau definiert da plattformabhängig.
> Es ist einfach schlechter Stil.

Zu unsigned long sagt mein Lieblingsbuch
> at least 32 Bit

Zu uint32_t sagt es:
> provided only if the implementation directly supports the type

Also, wie du darauf kommst, dass unsigned long jetzt schlechter Stil 
ist, kann ich beim besten Willen nicht erkennen.
Zumindest gibt es das immer, und es hat die hier geforderten 32Bits, 
mindestens.

Wobei es das uint32_t offensichtlich nicht immer geben muss.
Also baut man sich mit uint32_t einen Plattformabhängigen Bug ins 
Getriebe.

Im Prinzip also genau das Gegenteil, von dem was du erreichen möchtest.

Nein, aus der Sicht/Perspektive ist uin32_t die falsche Wahl und dem 
entsprechend schlechter Stil.

von Nick M. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Zu unsigned long sagt mein Lieblingsbuch
>> at least 32 Bit

Also auch mehr.
Nochdazu ist das mit unsigned char, long, ... dermaßen angestaubter C&R 
Stil, dass ich nur mal dezent empfehlen kann aktuelle Programme 
anzusehen. Nach bald 50 Jahren C kann man das schon mal verlangen.

Arduino Fanboy D. schrieb:

> Zu uint32_t sagt es:
>> provided only if the implementation directly supports the type

Wenn nicht vorhanden geht es nicht. Wäre schlecht wenn es 32 Bit 
Peripherie-Register gäbe. Folglich gibt es die Typen die man braucht.

Arduino Fanboy D. schrieb:
> Wobei es das uint32_t offensichtlich nicht immer geben muss.

Die gibt es (s.o.) genau dann wenn sie benötigt werden. Wenn es den 
uint32_t nicht gibt, dann wird sich der Compiler schon melden. Bei 
unsigned long denkt sich der Compiler halt was Anderes wie du. Und du 
bist dann garantiert unglücklich darüber.

Arduino Fanboy D. schrieb:
> kann ich beim besten Willen nicht erkennen.

Deine persönlichen Fähigkeiten sind aber nicht ausschlaggebend.

von S. R. (svenska)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wobei es das uint32_t offensichtlich nicht immer geben muss.

Wenn es uint32_t nicht gibt, dann ist entweder dein Compiler antik, du 
hast keine stdint.h / cstdint eingebunden, oder deine CPU kann schlicht 
nicht mit 32 Bit umgehen (auch nicht per Emulation).

von Einer K. (Gast)


Lesenswert?

S. R. schrieb:
> Wenn es uint32_t nicht gibt, dann ist entweder dein Compiler antik, du
> hast keine stdint.h / cstdint eingebunden, oder deine CPU kann schlicht
> nicht mit 32 Bit umgehen (auch nicht per Emulation).

"Ich" weiß das.
"Ich" weiß sogar, dass es völlig egal ist, ob man beim avr-gcc uint32_t 
schreibt oder unsigned long.
Denn, wie du schon sagst, der gcc und seine stdint.h gibt das her.

Aber dann darf man nicht von Plattform unabhängig sprechen, wenn es 
eben doch von der Plattform abhängig ist.
Ich weiß nicht, wie man das anders sehen kann, aber ich sehe da 
zumindest einen Widerspruch drin, evtl. auch einen Irrtum, die 
Unwahrheit und mit zunehmender Wiederholung auch eine Lüge.

In dem Posting von muellernick stecken 2 Irrtümer.
1. ihm bezeichnet uint32_t als Plattform unabhängig
2. ihm meint, seinen Stil anderen aufzudrücken zu müssen

Punkt 2 interessiert mich nicht.
Da darf jeder hackstücken, wie es beliebt.
OK, ein irgendwie gelagertes Priestertum, nervt auch schon etwas.
Nur nicht Stilfragen mit Unwahrheiten begründen, da fehlt mir die 
Toleranz.
In Stilfragen ist sowieso schon schwer Gleichschaltung zu erreichen, 
wenn da dann noch Unwahrheiten mit rein spielen....

Punkt 1, der ist schon halbwegs wichtig, wenn man über den AVR 
Tellerrand hinausblickt. Eben möglichst plattformneutral arbeiten 
möchte.
Und da liegt muellernick faktisch falsch.
Habe ihn darauf hingewiesen.
Zeigt sich völlig uneinsichtig.

Es geht also, über einen einfachen Irrtum, hinaus.

von Nick M. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> 1. ihm bezeichnet uint32_t als Plattform unabhängig

Was denkt ES sei daran falsch?
Meint DAS dass uint_32 unterschiedlich lang sei, so wie long?

Arduino Fanboy D. schrieb:
> 2. ihm meint, seinen Stil anderen aufzudrücken zu müssen

Ihm kannst das machen wie ohm will. Her schlage ich jedoch vor:
#define fanboyint long
Damit kann she versuchen was sich besser durchsetzt.

Derweilen überlege tu welche abscheuliche Gleichschaltung doch stdint 
ist
 E-KEL-HAFT!

von Hlllo Arduino Fanboy (Gast)


Lesenswert?

Hallo Arduino Fanboy,
Aber leider ist es nicht so, wie Du denkst.
Ja, unsigned long kann identisch mit uint32_t sein, muss es aber nicht.
Auf einem Atmel System ist ein int z.B. 8 Bit groß, auf einem Stm32 32 
Bit. Ein int beschreibt die native Größe der Datenbreite des Systems. 
Davon abhängig sind alle weiteren Typen. Ein unsigned long bezieht sich 
also ebenfalls auf int und ist auf einer 8-Bit Architektur nicht so 
groß, wie auf einer 32-Bit Architektur und somit nicht Plattform 
unabhängig.

Ein uint8_t wird überall 8 Bit breit seit, solange die Architektur damit 
umgehen kann. Genauso verhält es sich mit uint32_t und unsigned long.

Die in der stdint.h beschriebenen Datentypen sind somit unabhängig von 
der Architektur, solange diese mit den Typen umgehen kann.

Grüße

von Max (Gast)


Lesenswert?

Ich Depp habe im Namensfeld angefangen zu schreiben. Tut mir leid dafür.

Grüße Max

von Nick M. (Gast)


Lesenswert?

Noch was hinterher, sonst greift die Verdummung nur noch weiter um sich.

Arduino Fanboy D. schrieb:
>  ob man beim avr-gcc uint32_t schreibt oder unsigned long.
> Denn, wie du schon sagst, der gcc und seine stdint.h gibt das her.

Schön, nur ist das mit dem long so, dass es je nach Plattform eine 
andere Länge haben kann, im Gegensatz zu uint32_t.

> Aber dann darf man nicht von Plattform unabhängig sprechen, wenn es
> eben doch von der Plattform abhängig ist.

long ist abhängig von der Platform. uint32_t ist überall gleich lang, 
das ist der Grund warum uint32_t Plattforunabhängig ist.

> Ich weiß nicht, wie man das anders sehen kann, aber ich sehe da
> zumindest einen Widerspruch drin, evtl. auch einen Irrtum, die
> Unwahrheit und mit zunehmender Wiederholung auch eine Lüge.

Ja, du lügst. Du versuchst wieder mal durch Lügen als Schlauberger 
dazustehen.


> 2. ihm meint, seinen Stil anderen aufzudrücken zu müssen

Deine C-Programme können aussehen wie du willst. Ich vermute mal, die 
wird sowieso sonst niemand sehen.


> OK, ein irgendwie gelagertes Priestertum, nervt auch schon etwas.

So wissen die Leutehalt untereinander besser was der Andere meint. 
int16_t ist halt überall genau 16 Bit lang. Beim int ist das aber 
komplett anders. Aber du beweist ja schon zu genüge, dass du zu 
vernünftigeer Kommunikation nicht fähig bist.

> Nur nicht Stilfragen mit Unwahrheiten begründen, da fehlt mir die
> Toleranz.

Schreibtst du Tolleranz nicht mit zwei ll, so wie Looser mit zwei oo?
Egal, wo hab ich eine Unwahrheit verbreitet?

>  Unwahrheiten

Hab ich schon wieder die Unwahrheit gesprochen? Jetzt aber mit Zitat und 
Link.


> Punkt 1, der ist schon halbwegs wichtig, wenn man über den AVR
> Tellerrand hinausblickt.

Ach, plötzlich ist das doch gar nicht so schlecht kein long zu 
verwenden? Kommt jetzt die Wende?

> Und da liegt muellernick faktisch falsch.
> Habe ihn darauf hingewiesen.

Du weißt mich darauf hin long zu verwenden? Ich sags nochmal, es ist 
besser int32_t zu verwenden, weil dann jeder weiß was gemeint ist. 
"Sprechend programmieren" nennt sich das. Ich weiß morgen schon nicht 
mehr, wie die Registerbreite eines AVR (wecher denn?) ist.

> Zeigt sich völlig uneinsichtig.

Jep! So wie Millionen andere C-Programmierer.

> Es geht also, über einen einfachen Irrtum, hinaus.

Lass die Unterstellungen die du Grabhausfunsel nicht belegen kannst.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nick M. schrieb:
> E-KEL-HAFT!
Sind wir schon wieder beim Ich-und-Du?
Kaum zu glauben, dass hier erwachsene Menschen miteinander 
diskutieren...


Stefan ⛄ F. schrieb:
> 0x10000F23 (hexadezimal) = 268439331 (dezimal) =
> 0b10000000000000000111100100011 (binär)
An dieser Stelle empfehle ich, nicht den umständlichen Umweg über die 
Dezimalzahl zu machen, sondern einfach die Hexzahl Nibble für Nibble 
direkt in die Binärzahl abzubilden:
1
hex   binär
2
0   = 0000
3
1   = 0001
4
2   = 0010
5
3   = 0011
6
4   = 0100
7
:
8
:
9
D   = 1101
10
E   = 1110
11
F   = 1111
12
13
-->
14
15
0x      1    0    0    0    0    F    2    3
16
0b   0001 0000 0000 0000 0000 1111 0010 0011
Dann muss man auch links nichts mehr "auffüllen", denn die Nullen sind 
beim stupiden "Umzeichnen" (denn von "Umrechnen" kann da keine Rede mehr 
sein) schon reingekommen. Letztlich muss man sich dann also nur 16 
solcher 4-Bit-Muster merken und ist fürderhin ein "Blitzumrechner" von 
Bin nach Hex und umgekehrt.
Und dann tauchen auch nicht auf einmal noch 2 zusätzliche verwirrende 
führende Bits im Kommentar auf, so wie
Arduino Fanboy D. schrieb:
> a = 0x10000F23; // 0b0000010000000000000000111100100011

von Nick M. (Gast)


Lesenswert?

Lothar M. schrieb:
>> E-KEL-HAFT!
> Sind wir schon wieder beim Ich-und-Du?

Habs ja versucht, wie der fanboy, "ihm" zu verwenden. Aber irgendwie 
kommt mir das so Regenbogen vor, dass mir ekelt.

Wenn du aber den Inhalt der Postings einzig durch die Anzahl der "Du" 
bewertest,  würde ich dir doch mal nahelegen den hahnebüchernen Quatsch 
vom Fanboy genauer zu lesen.
Und vor allem bitte auch nachvollziehen wie er wieder ausgeflippt ist.
Hier ging es los:
Beitrag "Re: Verständnisproblem in AVR C Syntax"

Da siehst du auch wieder wie hier fachliche neutrale Inhalte bewertet 
werden (mit -2 Punkten). Denen geht es mehr ums prahlen.
Mir nicht, darum trage ich alle Minuspunkte als Auszeichnung. :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nick M. schrieb:
> Da siehst du auch wieder wie hier fachliche neutrale Inhalte bewertet
> werden
Der Ton macht die Musik. Und eure "Musik" ist atonaler Lärm und Krach. 
So wie wenn zwei Kinder auf Töpfen herumtrommeln um einander zu 
übertönen.

> Und vor allem bitte auch nachvollziehen wie er wieder ausgeflippt ist.
Wann immer man auf einen anderen zeigt, zeigen 3 Finger zurück.

> Wenn du aber den Inhalt der Postings einzig durch die Anzahl der "Du"
> bewertest
Ich bewerte die Sachlichkeit an der Anzahl von Personalpronomen. Dazu 
gehören neben ich und du auch mein, sein, dir, ihm, ihr usw. Denn wenn 
die Überhand gewinnen, kann es nicht mehr um "die Sache" gehen.

> darum trage ich alle Minuspunkte als Auszeichnung.
Jetzt bitte nicht auch noch den Märtyrer heraushängen...

von Stefan F. (Gast)


Lesenswert?

Lothar M. schrieb:
> An dieser Stelle empfehle ich, nicht den umständlichen Umweg über die
> Dezimalzahl zu machen, sondern einfach die Hexzahl Nibble für Nibble
> direkt in die Binärzahl abzubilden:

Ich empfehle, einen Taschenrechner zu benutzen, den entfällt nicht nur 
der "Umweg" sondern auch das Kopfrechnen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich empfehle, einen Taschenrechner zu benutzen, den entfällt nicht nur
> der "Umweg" sondern auch das Kopfrechnen.
Und man setzt sich auch nicht der Gefahr aus, ein "Gefühl" für diese 
Zahlen zu bekommen.

Es ist z.B. auch hilfreich zu wissen, dass 2^10 etwa 1000 sind (genau 
1024) oder 2^20 etwa 1 Million (genauer 1024*1024) und 2^30 etwa 1 
Milliarde (exakt 1024*1024*1024). Wenn man das weiß, dann kann man sein 
Taschenrechnerergebnis auch schnell mal auf Plausibilität bzw. 
Tippfehler "kontrollieren".

Aber du hast Recht, es geht auch mit dem Taschenrechner.

von Nick M. (Gast)


Lesenswert?

Lothar M. schrieb:
> Ich bewerte die Sachlichkeit an der Anzahl von Personalpronomen. Dazu
> gehören neben ich und du auch mein, sein, dir, ihm, ihr usw. Denn wenn
> die Überhand gewinnen, kann es nicht mehr um "die Sache" gehen.

Keine Ahnung wo andere Teilnehmer wohnen. Unsereins wohnt in Bayern. Und 
da ist es so, dass man die Leute mit denen man spricht mit Du oder Sie 
anredet. Ganz egal ob das der Müllfahrer oder der Arzt ist. Wir 
betrachten das als Form der Höflichkeit. Wenn das in anderen Regionen 
Deutschlands als höflich angesehen wird Leute nicht direkt anzusprechen: 
Bei uns ist das eine Beleidigung.

Lothar M. schrieb:
>> Und vor allem bitte auch nachvollziehen wie er wieder ausgeflippt ist.
> Wann immer man auf einen anderen zeigt, zeigen 3 Finger zurück.

Ach, solch Moralin-triefende Sprüche! Es fehlt noch einer: Der Klügere 
gibt nach (bis er der Dümmere ist).

Lothar M. schrieb:
>> darum trage ich alle Minuspunkte als Auszeichnung.
> Jetzt bitte nicht auch noch den Märtyrer heraushängen...

Bin kein Märtyrer. Ich lass mir nur nichts gefallen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Arduino Fanboy D. schrieb:
> Aber dann darf man nicht von Plattform unabhängig sprechen, wenn es eben
> doch von der Plattform abhängig ist.

Es kommt darauf an, was man unter "Plattform" versteht. Da gibt es zwei 
Möglichkeiten:

- C-Compiler als "Plattform"

Hier könnte ein anderer C-Compiler als gcc durchaus eine andere 
Auffassung über die Breite eines "unsigned long" haben. Ich weiß, dass 
es AVR-C-Compiler gibt, die mit einem 8-Bit-breiten "int" arbeiten.

Von daher wäre die Verwendung eines uint32_t unabhängig vom C-Compiler 
und damit portabler.

- Hardware als "Plattform"

Das CAN Registers CANIDT im AT90CAN128 ist 32 Bit breit. Von daher 
empfiehlt sich auch hier die Verwendung eines uint32_t, um portabel zu 
sein. Ein unsigned long könnte bei Wechsel des Compilers zu Problemen 
führen.

Fazit:

Wie man es auch dreht und wendet: Die Verwendung von uint32_t ist hier 
angesagt - egal, ob man als "Plattform" den C-Compiler oder die Hardware 
sieht.

Hlllo Arduino Fanboy schrieb:
> Auf einem Atmel System ist ein int z.B. 8 Bit groß,

Falsch. Es sind 16 Bit. Jedenfalls beim avr-gcc.

von Carl D. (jcw2)


Lesenswert?

Frank M. schrieb:
> Hlllo Arduino Fanboy schrieb:
>> Auf einem Atmel System ist ein int z.B. 8 Bit groß,
>
> Falsch. Es sind 16 Bit. Jedenfalls beim avr-gcc.

Solange man in nicht mit "-mint8" dazu überredet, die C-Regel "int hat 
min. 16bit" zu missachten.

von Nick M. (Gast)


Lesenswert?

Frank M. schrieb:
>> Auf einem Atmel System ist ein int z.B. 8 Bit groß,
>
> Falsch. Es sind 16 Bit. Jedenfalls beim avr-gcc.

Das ist dieser Mist mit dem int und long und ...
Ein int ist 2 Bytes oder 4 Bytes lang. Üblicherweise.

Man hat das historisch bedingt komplett vermurkst.
Seit C99 (sehr oft aber auch in Nicht-C99 übernommen) ist das ordentlich 
definiert.

X ist 8, 16, 32, 64 (das stimmt so nicht ganz)
intX_t & uintX_t: So breit wie angegeben.
int_leastX_t & uint_leastX_t: Der Compiler sucht sich das raus was ihm 
am liebsten ist.
int_fastX_t & uint_fastX_t: Vom Compiler gewähltes X darf größer sein, 
falls der Prozessor das schneller verarbeiten kann.
intmaxX_t & uintmaxX_t: Der größte int der implementiert ist.
intptr_t & uintptr_t: Int der groß genug ist einen Pointer aufzunehmen.

Man sieht, da hat man sich einiges dazu überlegt. Und das sollte man 
dann auch besonders beim µC verwenden.

Bei floats ist alles klar geregelt.

von Nick M. (Gast)


Lesenswert?

Carl D. schrieb:
> Solange man in nicht mit "-mint8" dazu überredet, die C-Regel "int hat
> min. 16bit" zu missachten.

LOL! Cool! Ein Grund mehr für uint_16 und Konsorten.

von Rolf M. (rmagnus)


Lesenswert?

Nick M. schrieb:
> Nochdazu ist das mit unsigned char, long, ... dermaßen angestaubter C&R
> Stil, dass ich nur mal dezent empfehlen kann aktuelle Programme
> anzusehen. Nach bald 50 Jahren C kann man das schon mal verlangen.

Da sehe ich nichts angestaubtes drin.
Festbreitentypen wie uint32_t sind dafür gedacht, dass man sie genau 
dann nutzt, wenn es essenziell ist, dass der Typ exakt 32 Bit breit ist 
und auf gar keinen Fall größer oder kleiner.
Bei der Berechnung, um die es hier geht, entsteht aber kein Fehler, wenn 
der Wert größer ist als 32 Bit, also ist uint32_t nicht der am besten 
geeignete Typ, da er unnötig stark einschränkt.

> Arduino Fanboy D. schrieb:
>> Wobei es das uint32_t offensichtlich nicht immer geben muss.
>
> Die gibt es (s.o.) genau dann wenn sie benötigt werden. Wenn es den
> uint32_t nicht gibt, dann wird sich der Compiler schon melden. Bei
> unsigned long denkt sich der Compiler halt was Anderes wie du.

Also zumindest ich denke bei unsigned long, dass ich einen Typ haben 
will, der mindestens 32 Bit breit ist. Genau das gibt mir der Compiler.

Arduino Fanboy D. schrieb:
> Punkt 1, der ist schon halbwegs wichtig, wenn man über den AVR
> Tellerrand hinausblickt. Eben möglichst plattformneutral arbeiten
> möchte.
> Und da liegt muellernick faktisch falsch.
> Habe ihn darauf hingewiesen.
> Zeigt sich völlig uneinsichtig.
>
> Es geht also, über einen einfachen Irrtum, hinaus.

Es gibt neben den Basistypen und uint32_t auch noch weitere typedefs in 
stdint.h, nämlich uint_least32_t und uint_fast32_t. Die finden in der 
Praxis leider eher wenig Beachtung, sind aber eigentlich genau dafür da. 
Ersteres ist der kleinstmögliche Typ, der mindestens 32 Bit hat, 
zweiteres der schnellste mit mindestens 32 Bit. So kann man je nachdem, 
ob einem der Speicher oder die Laufzeit wichtiger ist, den passenden Typ 
wählen und sich dabei gleichzeitig nicht auf die exakten 32 Bit 
festzurren.

Hlllo Arduino Fanboy schrieb:
> Ja, unsigned long kann identisch mit uint32_t sein, muss es aber nicht.
> Auf einem Atmel System ist ein int z.B. 8 Bit groß,

Das kann man optional in GCC so einstellen, ist aber nicht 
standardkonform. int muss immer mindestens 16 Bit breit sein.

> Ein int beschreibt die native Größe der Datenbreite des Systems.

Er sollte möglichst die native Größe beschreiben, aber das ist laut 
Standard nicht verpflichtend. Auf 64-Bit-Systemen wird das meistens auch 
nicht gemacht. Dort ist int dann trotzdem 32 Bit breit, einfach weil man 
sonst zu wenig Typen für die gängigeren kleineren Größen hätte.

> Davon abhängig sind alle weiteren Typen. Ein unsigned long bezieht sich
> also ebenfalls auf int

long muss mindestens 32 Bit breit sein und darf nicht kleiner sein als 
int.

Nick M. schrieb:
> long ist abhängig von der Platform. uint32_t ist überall gleich lang,
> das ist der Grund warum uint32_t Plattforunabhängig ist.

long existiert auf jeder Plattform und ist auf jeder Plattform 
mindestens 32 Bit breit. Ob uint32_t existiert, hängt von der Plattform 
ab.

> So wissen die Leutehalt untereinander besser was der Andere meint.
> int16_t ist halt überall genau 16 Bit lang. Beim int ist das aber
> komplett anders.

Die spannene Frage ist doch: Wie oft brauchst du in der Praxis überhaupt 
die Zusicherung, dass der Typ wirklich exakt 16 Bit hat und auf gar 
keinen Fall mehr? Mir fallen da im Wesentlichen zwei Stellen ein: 
Hardware-Register und binäre Kommunikation (über eine Schnittstelle oder 
eine Datei). Da spielt das aber auch nur auf unterster Ebene eine Rolle.

Nick M. schrieb:
> Keine Ahnung wo andere Teilnehmer wohnen. Unsereins wohnt in Bayern. Und
> da ist es so, dass man die Leute mit denen man spricht mit Du oder Sie
> anredet. Ganz egal ob das der Müllfahrer oder der Arzt ist. Wir
> betrachten das als Form der Höflichkeit. Wenn das in anderen Regionen
> Deutschlands als höflich angesehen wird Leute nicht direkt anzusprechen:
> Bei uns ist das eine Beleidigung.

Es geht wohl nicht darum, ob man sie benutzt, um jemanden anzusprechen, 
sondern eher darum, wie häufig diese Wörter in einer technischen 
Diskussion vorkommen. Wenn sie sich sehr häufen, liegt der Verdacht 
nahe, dass man mehr über einander diskutiert (aka. Flamewar) als über 
das eigentliche Thema.

Nick M. schrieb:
> X ist 8, 16, 32, 64 (das stimmt so nicht ganz)

Richtig. Denn auf einem DSP, der nur in Vielfachen von 24 Bit arbeiten 
kann, kann X auch 24 sein. Dann gibt's halt die [u]intX_t für die von 
dir angegebenen Größen nicht, aber einen [u]int24_t. Die least- und 
fast-Typen gibt es trotzdem für die von dir angegebenen Größen. Das ist 
deren Vorteil.

> int_leastX_t & uint_leastX_t: Der Compiler sucht sich das raus was ihm
> am liebsten ist.

Nein, er nimmt das kleinste, was mindestens X Bits hat.

> Bei floats ist alles klar geregelt.

Nö.

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

Nick M. schrieb:
> Keine Ahnung wo andere Teilnehmer wohnen. Unsereins wohnt in Bayern. Und
> da ist es so, dass man die Leute mit denen man spricht mit Du oder Sie
> anredet. Ganz egal ob das der Müllfahrer oder der Arzt ist. Wir
> betrachten das als Form der Höflichkeit. Wenn das in anderen Regionen
> Deutschlands als höflich angesehen wird Leute nicht direkt anzusprechen:
> Bei uns ist das eine Beleidigung.

Und wie ist es mit "das Mensch"? War mal ein bayrischer Ausdruck. 
Verwende ich nicht, komme aus Franken!

von Nick M. (Gast)


Lesenswert?

Rolf M. schrieb:
> Nick M. schrieb:
>> long ist abhängig von der Platform. uint32_t ist überall gleich lang,
>> das ist der Grund warum uint32_t Plattforunabhängig ist.
>
> long existiert auf jeder Plattform und ist auf jeder Plattform
> mindestens 32 Bit breit. Ob uint32_t existiert, hängt von der Plattform
> ab

Es geht aber um exakte Länge. Wenn man wenig Platz hat kann das 
essentiell sein.
Es geht auch darum (Stilfrage) Anderen mitzuteilen, dass es explizit 32 
Bit sind die die Daten vollständig und ohne Platzverschwendung 
darstellen können. Am PC mag das nicht relevant sein.

Es geht nochmal um die exakte Länge. Stell dir eine Datenübertragung 
vor. Es dient niemanden wenn der long mal länger ist, die Gegenseite 
wird Mist lesen. Oder die Gegenseite naiverweise auch ein long 
verwendet, obwohl die einen 64-Bit Prozessor hat.

Es geht nochmal um die exakte Länge wenn man z.B. einen Wert in ein 
EPROM schreiben will. Oder per seek() in eine Datei schreiben will. Das 
kann bei einer Portierung fatal ausgehen.
Ich sehe einfach keinen Gewinn darin solche Zeitbomben im Code zu 
vergraben.

Rolf M. schrieb:
>> X ist 8, 16, 32, 64 (das stimmt so nicht ganz)
>
> Richtig. Denn auf einem DSP, der nur in Vielfachen von 24 Bit arbeiten
> kann, kann X auch 24 sein. Dann gibt's halt die [u]intX_t für die von
> dir angegebenen Größen nicht,

Das war das mit dem "stimmt so nicht ganz"
Die Längen 8, 16, 32 und 64 müssen bei int_least und int_fast 
implementiert sein. Jedoch kann (und wird) der Compiler was größeres bei 
intX_t nehmen. Ich hab schon gesehen, dass du intX_t geschrieben hast!

Rolf M. schrieb:
>> int_leastX_t & uint_leastX_t: Der Compiler sucht sich das raus was ihm
>> am liebsten ist.
>
> Nein, er nimmt das kleinste, was mindestens X Bits hat.

Da hab ich mich schlecht ausgedürckt. Der Compiler nimmt das, was 
mindestens X Bit hat.
"An integer type whose width is at least X bits."

>> Bei floats ist alles klar geregelt.
>
> Nö.

Nach IEC 60559 schon. Muss der Compiler aber nicht implementieren, 
insofern hast Du recht. (Makro
1
__STDC_IEC_559__
 nicht definiert)

von Einer K. (Gast)


Lesenswert?

Ich antworte dir, weil du mich direkt angesprochen hast.....

Frank M. schrieb:
> Von daher wäre die Verwendung eines uint32_t unabhängig vom C-Compiler
> und damit portabler.
Du möchtest mir sagen, dass die Verwendung eines Datentyps, welche nicht 
auf jeder Maschine existiert, portabler ist, als ein Datentype der die 
Mindestanzahl Bits die man braucht garantiert.
Habe ich das richtig verstanden?

Auch das -mint8, hat meiner Ansicht nach nichts mit Plattform unabhängig 
zu tun. Das ist eine Gcc Extrawurst, mit der man sich selbst außerhalb 
des Standards befördert. Selbst die mitgelieferte Libc versagt dann. Das 
-mint8 halte ich bei dieser Diskussion für eine Nebelkerze.

Ich habe ja nichts dagegen, wenn einer uint32_ verwendet.
Alles gut.
Das mag in der kleinen AVR Welt sogar die "schönere" Variante sein...

Allerdings:
Der Kollege, dessen Namen ich nicht nenne werde, hat die Behauptung 
aufgestellt, dass die uint32_t besserer Stil ist, weil es Plattform 
unabhängig ist.
Genau die Behauptung, dass unt32_t Plattform  unabhängig ist, ist eine 
Lüge.
Sollte in jedem halbwegs brauchbaren C und C++ Buch nachlesbar sein.
Wem sollte man glauben, der Doku, oder einer erkannten Unwahrheit?

Es ist unlogisch, sich auf seinen AVR Tellerrand zu berufen und von der 
Position dann über "Plattform Unabhängigkeit" zu schwadronieren.

Ja, dann könnte man auch sagen: Die Erde ist eine Scheibe.
Denn da wo ich stehe, sieht sie total platt aus.

Ich denke, das scheint die beste Lösung für diesen Streit zu sein:
Vielleicht sollte man den Begriff "Plattform unabhängig" mal neu 
definieren, in eurem Sinne.
Oder einen anderen Begriff verwenden.
Oder die Sprachdefinition umschreiben.

Ach, sofort alles Sprachstandards unbesehen in die Tonne stopfen...

---------

Betrachtet man nur AVR-gcc, ist die ganze "Portabilität" Diskussion 
sowieso überflüssig.
unsigned long und uint32_t sind da identisch. Das gilt sicherlich auch 
für die meisten 32Bit Maschinchen/Compiler



Wenn man den Standard fragt:
> Welches ist der kleinstmögliche und vorzeichenlose Datentype,
> der mir mindestens den Raum bietet, um 32 Bit Werte
> zurecht zu dengeln?
Dann lautet die Antwort: unsigned long

Legt man Wert, auf möglichst weit reichende Portabilität, darf man eben 
nicht uint32_t nehmen, weil es eben nicht garantiert auf jedem 
Kesselchen existiert.

Zudem, ist es auch für die Performance meist ganz gut, wenn man den 
Prozessor, möglichst mit seinen "natürlichen" Datentypen operieren 
lässt.
z.B. einen 64Bit Rechner nicht zwingt uint32_t zu emulieren
Die paar überflüssigen Bit tun keinem weh, kosten keinen Takt mehr
Und die Bits bastelt der Compiler meist an anderer Stelle sowieso rein.
> alignment, padding


Aber was solls, ich habe je eh keine Ahnung....
Ihr soll euer "recht" haben.
Auch möchte ich euch herzlichst um Verzeihung bitten, dass ich eine 
andere Vorstellung von "Plattform Unabhängigkeit" habe, als ihr.

von Nick M. (Gast)


Lesenswert?

Franz schrieb:
> Es ging um das Beschreiben des 32 Bit CAN Registers CANIDT im
> AT90CAN128.

Rolf M. schrieb:
> Bei der Berechnung, um die es hier geht, entsteht aber kein Fehler, wenn
> der Wert größer ist als 32 Bit, also ist uint32_t nicht der am besten
> geeignete Typ, da er unnötig stark einschränkt.

Da bin ich anderer Meinung. Wobei man das von Franz durchaus überlesen 
kann wenn man so spät einsteigt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Arduino Fanboy D. schrieb:
> dass unt32_t Plattform unabhängig ist
Seit C99 gehört stdint zu den Standardbibliotheken:
https://en.wikibooks.org/wiki/C_Programming/stdint.h
https://en.wikibooks.org/wiki/C_Programming/Standard_libraries
Und wenn es irgendein Compilerbauer in dem seither vergangenen viertel 
Jahrhundert nicht geschafft hat, diese Funktionalität zu implementieren 
(bzw. den nötigen Header mitzuliefern), dann gäbe mir das zu denken.

: Bearbeitet durch Moderator
von Nick M. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Genau die Behauptung, dass unt32_t Plattform  unabhängig ist, ist eine
> Lüge.

Lass es einfach bleiben.
Wenn man genau 32 Bit schreiben muss und die Platform unterstützt es 
nicht, dann sagt es dir der Compiler. Du hast damit einen kapitalen 
Fehler vermieden und musst dir einen anderen Prozessor aussuchen.
Wenn es mindestens 32 Bit sein müssen, dann nimmt man int_least32_t

Arduino Fanboy D. schrieb:
> Wenn man den Standard fragt:
>> Welches ist der kleinstmögliche und vorzeichenlose Datentype,
>> der mir mindestens den Raum bietet, um 32 Bit Werte
>> zurecht zu dengeln?
> Dann lautet die Antwort: unsigned long
>
> Legt man Wert, auf möglichst weit reichende Portabilität, darf man eben
> nicht uint32_t nehmen, weil es eben nicht garantiert auf jedem
> Kesselchen existiert.
>
> Zudem, ist es auch für die Performance meist ganz gut, wenn man den
> Prozessor, möglichst mit seinen "natürlichen" Datentypen operieren
> lässt.

Was ist daran so schwer zu verstehen?

Nick M. schrieb:
> X ist 8, 16, 32, 64 (das stimmt so nicht ganz)
> intX_t & uintX_t: So breit wie angegeben.
> int_leastX_t & uint_leastX_t: Der Compiler sucht sich das raus was mindestens X 
breit ist (geändert)
> int_fastX_t & uint_fastX_t: Vom Compiler gewähltes X darf größer sein,
> falls der Prozessor das schneller verarbeiten kann.
> intmaxX_t & uintmaxX_t: Der größte int der implementiert ist.
> intptr_t & uintptr_t: Int der groß genug ist einen Pointer aufzunehmen.

von Einer K. (Gast)


Lesenswert?

Lothar M. schrieb:
> Arduino Fanboy D. schrieb:
>> dass unt32_t Plattform unabhängig ist
> Seit C99 gehört stdint zu den Standardbibliotheken:
> https://en.wikibooks.org/wiki/C_Programming/stdint.h
> https://en.wikibooks.org/wiki/C_Programming/Standard_libraries
> Und wenn es irgendein Compilerbauer in dem seither vergangenen viertel
> Jahrhundert nicht geschafft hat, diese Funktionalität zu implementieren
> (bzw. den nötigen Header mitzuliefern), dann gäbe mir das zu denken.

Also mein Buch sagt:
> provided only if the implementation directly supports the type
Es gibt also keine Pflicht das zu implementieren.

Dein Link sagt:
> These types are optional unless the implementation supports
> types with widths of 8, 16, 32 or 64, then it shall typedef
> them to the corresponding types with corresponding N.
> Any other N is optional[1] .
Also recht gleichlautend.
uint32_t wird implementiert, wenn der Prozessor/Compiler das von Hause 
aus kann.
Sonst nicht.
Es gibt keine Verpflichtung, da eine uint32_t Emulation zu 
implementieren.



Die Gründe das frei zu halten, "könnten" im gleichen Bereich liegen, wie 
die Größe eines Byte, oder besser char, nicht festzulegen.

uin32_t mag ja für viele Kesselchen ein natürlicher Datentype sein.
Für einige andere allerdings nicht, z.B. die seltenen 9 Bit pro char 
Kesselchen.
Dort geht uint32_t mit einem Mehraufwand einher.
Es bleibt dem Compiler Ersteller überlassen, ob er es implementiert.

uint32_t ist für 32 Bit Rechner ein natürlicher Datentype
8Bit Rechner werden in eine Emulation gezwungen
64Bit Rechner sicherlich auch.
9Bit Rechner werden es gar nicht haben, oder emulieren.

Wie schon gesagt:
Mein Begriff von "Plattform unabhängig" unterscheidet sich 
offensichtlich von manch anderen.

von Arno (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wie schon gesagt:
> Mein Begriff von "Plattform unabhängig" unterscheidet sich
> offensichtlich von manch anderen.

"Ein Geisterfahrer? Hunderte!"

Ja, offensichtlich verstehst du plattformunabhängig nicht wie die 
meisten Menschen als "liefert auf jeder Plattform das gleiche Ergebnis - 
oder einen Fehler" sondern als "läuft auf jeder Plattform, wenn auch mit 
unterschiedlichem Ergebnis".

MfG, Arno

von Andreas M. (amesser)


Lesenswert?

Es macht auf einem AVR8Bit sehr wohl einen Unterschied in der 
Performance, ob man für einen Zähler im Bereich 0-255 ein "uint8_t" oder 
ein "unsigned" benutzt. Letzteres zwingt den Compiler dazu 
unnötigerweise 16 bit Operationen zu machen. (Einfach auf den 
Assemblercode schauen, sieht man sofort)

Der korrekte Weg um z.B. eine lokale Ganzzahlvariable zu deklarieren ist 
"[u]int_fast_[8|16|32|64]_t". Damit wird dem Compiler die Mindestgröße 
der Variable mitgeteilt und ihm gleichzeitig frei gestellt größere, der 
CPU Architektur besser passende Typen, zu verwenden. Ein uint_fast8_t 
hat auf einem AVR 8 Bit, auf einem MSP430 16Bit und auf ARM 32 Bit.

Ganz anders sieht es aus wenn man Strukturen definiert. Hier sollte man 
mit "[u]int_least_[8|16|32|64]_t" arbeiten. Man gibt dem Compiler damit 
auch wieder die Mindestgröße in Bits vor und lässt ihn den kleinsten, 
von der Architektur unterstützten Datentyp wählen, der diese Anforderung 
erfüllt. Dadurch erreicht man das die Strukturen möglichst klein sind (= 
mehr freier Speicher) und parallel dazu aber die Beschränkungen der 
Platform automatisch berücksichtigt werden. Es gibt z.B. DSPs die können 
nicht Byteweise auf den Speicher zu greifen, da ist uint_least8_t dann 
z.B. 16 Bit groß. Wir haben hier in der Firma ne CPU die nicht mal 16 
Bit kann.

von Einer K. (Gast)


Lesenswert?

Arno schrieb:
> Ja, offensichtlich verstehst du plattformunabhängig nicht wie die
> meisten Menschen als "liefert auf jeder Plattform das gleiche Ergebnis -
> oder einen Fehler" sondern als "läuft auf jeder Plattform, wenn auch mit
> unterschiedlichem Ergebnis".

Du darfst da rein interpretieren, was du möchtest.....

Allerdings ist die Kernaussage, meines ganzen Sermons hier:
uint32_t als Plattform unabhängig zu bezeichnen ist falsch.
Eine Unwahrheit, ein Irrtum, und bei Wiederholung eine Lüge.
Die Doku gibt mir recht.

von Rolf M. (rmagnus)


Lesenswert?

Nick M. schrieb:
> Es geht aber um exakte Länge.

Warum?

> Wenn man wenig Platz hat kann das essentiell sein.

Dann ist Patz sparen wichtig, nicht eine exakte Länge. Dann nimmt man 
uint_least32_t. Die least-Typen sind wie gesagt die Platzspartypen.
> Es geht auch darum (Stilfrage) Anderen mitzuteilen, dass es explizit 32
> Bit sind die die Daten vollständig und ohne Platzverschwendung
> darstellen können.

Genau das sagt uint_least32_t am besten.

> Es geht nochmal um die exakte Länge. Stell dir eine Datenübertragung
> vor. Es dient niemanden wenn der long mal länger ist, die Gegenseite
> wird Mist lesen.
> Es geht nochmal um die exakte Länge wenn man z.B. einen Wert in ein
> EPROM schreiben will. Oder per seek() in eine Datei schreiben will. Das
> kann bei einer Portierung fatal ausgehen.

Das hab ich doch geschrieben, dass man die Festbreitentypen genau für 
solche Sachen braucht. Da sind sie auch absolut sinnvoll, aber meiner
Ansicht nach eben nur da.
Ich würde nach diesem Schema vorgehen:

[u]int_leastX_t: Wenn man eher Platz sparen will
[u]int_fastX_t:  Wenn man eher Zeit sparen will
[u]int_X_t:      Wenn eine Schnittstelle eine ganz bestimte Größe 
diktiert

Und wenn alles 3 nicht zutrifft, kann man auch auf die klassischen 
char/short/long/long long zurückgreifen. Natürlich muss man sich dabei 
darüber bewusst sein, was die garantieren und was nicht.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Arduino Fanboy D. schrieb:
> Du möchtest mir sagen, dass die Verwendung eines Datentyps,
> welche nicht auf jeder Maschine existiert, portabler ist,
> als ein Datentype der die Mindestanzahl Bits die man braucht
> garantiert.

Wenn du eine Maschine benutzt, die keinen uint32_t kennt, dann kannst du 
ihn dir gern selbst definieren. Vernünftige Menschen benutzen 
vernünftige Datentypen, und das ist in der heutigen Zeit irgendwas mit 
einem garantierten Wertebereich. Ich bevorzuge Code, der bestimmte 
Fehler grundsätzlich vermeidet.

Weder "int" noch "long" garantieren einen Wertebereich - sie garantieren 
ein minimales Maximum. Unsigned overflow ist definiertes Verhalten im 
Rahmen des Standards und daher auf diesen Datentypen beispielsweise 
wesentlich abhängiger von der Plattform als dein Beispiel.

Diesmal hast du dich schlicht verrannt. Ich mag des Nick's 
Diskussionsstil auch nicht, aber hier blendet dich der Hass.

von S. R. (svenska)


Lesenswert?

Arduino Fanboy D. schrieb:
> Allerdings ist die Kernaussage, meines ganzen Sermons hier:
> uint32_t als Plattform unabhängig zu bezeichnen ist falsch.

Schöner Strohmann: Das hat ja auch niemand behauptet.

von Roland F. (rhf)


Lesenswert?

Hallo,
Stefan ⛄ F. schrieb:
> Ich empfehle, einen Taschenrechner zu benutzen, den entfällt nicht nur
> der "Umweg" sondern auch das Kopfrechnen.

Das ist doch nicht dein Ernst, oder?

rhf

von Sebastian W. (wangnick)


Lesenswert?

Arduino Fanboy D. schrieb:
> Allerdings ist die Kernaussage, meines ganzen Sermons hier:
> uint32_t als Plattform unabhängig zu bezeichnen ist falsch.
> Eine Unwahrheit, ein Irrtum, und bei Wiederholung eine Lüge.
> Die Doku gibt mir recht.

Ich lese http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf so 
dass uint32_t 32 bit lang ist und Werte von 0 bis UINT32_MAX annehmen 
kann. Plattformunabhängig. Nach dem Standard ist uint32_t optional.

uint_least32_t ist mindestens 32 bit lang und kann Werte von 0 bis 
UINT_LEAST32_MAX annehmen. Der Standard sagt nicht, dass uint_least32_t 
optional ist.

ULONG_MAX, der Maximalwert von unsigned long int, ist laut Standard 
mindestens 4294967295.

Ich bevorzuge inzwischen oft die fix definierten Typen (uint8_t etc), 
aber wenn die Bibliotheksfunktionen unsigned char, unsigned long oder so 
erwarten und liefern dann ist schön anders. Echte 
Plattformunabhängigkeit ist eh schwierig, zum Beispiel wenn es um 
Geschwindigkeit geht.

LG, Sebastian

: Bearbeitet durch User
von Nick M. (Gast)


Lesenswert?

Rolf M. schrieb:
>> Es geht auch darum (Stilfrage) Anderen mitzuteilen, dass es explizit 32
>> Bit sind die die Daten vollständig und ohne Platzverschwendung
>> darstellen können.
>
> Genau das sagt uint_least32_t am besten.

Wenn es explizit 32 sein müssen ist uint_least32 falsch.
Aber wir verstehen uns schon!

Rolf M. schrieb:
> Das hab ich doch geschrieben, dass man die Festbreitentypen genau für
> solche Sachen braucht.

Also Übereinstimmung.
Die Diskussion ist wegen eines CAN Registers mit 32 Bit losgegangen.

Rolf M. schrieb:
> Ich würde nach diesem Schema vorgehen:

Alles d'accord!

von Rolf M. (rmagnus)


Lesenswert?

Nick M. schrieb:
> Also Übereinstimmung.
> Die Diskussion ist wegen eines CAN Registers mit 32 Bit losgegangen.

Eigentlich ging es nur um folgende Berechnung:

Franz schrieb:
> a = 0x10000F23
> a = (a << 3)

Eine 29-Bit-CAN-ID soll um drei Bit nach links geschoben werden. Dass 
das Ergebnis nachher in ein Register geschrieben wird, ist dafür 
eigentlich gar nicht relevant. Das heißt, für a würde ich uint32_t nicht 
als zwingend sehen, für das Register natürlich schon. Aber da die Aktion 
dazu dient, den Wert für das Register aufzubereiten, wäre uint32_t auch 
nicht ganz verkehrt.

> Rolf M. schrieb:
>> Ich würde nach diesem Schema vorgehen:
>
> Alles d'accord!

Prima!

von Joachim B. (jar)


Lesenswert?

Arduino Fanboy D. schrieb:
> Allerdings:
> Der Kollege, dessen Namen ich nicht nenne werde, hat die Behauptung
> aufgestellt, dass die uint32_t besserer Stil ist, weil es Plattform
> unabhängig ist.
> Genau die Behauptung, dass unt32_t Plattform  unabhängig ist, ist eine
> Lüge.

wieso Lüge, vom MS x86 Rechner kommend hatten wir in C unsere eigenen 
#defines gemacht
#define BYTE
#define UBYTE
#define WORD
#define UWORD
#define DWORD
#define UDWORD
#define QWORD
#define UQWORD

usw.
das nun umzuschreiben zu
#define int8_t
#define uint8_t
#define int16_t
#define uint16_t
#define int32_t
#define uint32_t
#define int64_t
#define uint64_t

das macht es definitiv Plattform unabhängiger, schliesslich laufen meine 
alten C-Routinen auch immer noch auf dem AVR

> Sollte in jedem halbwegs brauchbaren C und C++ Buch nachlesbar sein.
> Wem sollte man glauben, der Doku, oder einer erkannten Unwahrheit?

als wenn in Dokus oder Bücher nicht nur Meinungen der Autoren vertreten 
werden, oder glaubst du ALLES nur weil es geschrieben steht?

von Sebastian W. (wangnick)


Lesenswert?

[Off Topic]
Liebe Leute,

ich finde es schade wie sich der Umgangston in diesem Forum in den 
letzten Jahren entwickelt hat. Sich der Lüge zu zeihen oder andere 
persönliche Anwürfe scheinen inzwischen normal geworden zu sein. Mir 
fällt es zunehmend schwerer den ja fachlich interessanten Debatten (so 
wie dieser) mit Interesse zu folgen.

Erkennen wir nicht mehr, wohlmeinend, die gute Absicht des Anderen?

LG, Sebastian
[/Off Topic]

von Einer K. (Gast)


Lesenswert?

S. R. schrieb:
> Arduino Fanboy D. schrieb:
>> Allerdings ist die Kernaussage, meines ganzen Sermons hier:
>> uint32_t als Plattform unabhängig zu bezeichnen ist falsch.
>
> Schöner Strohmann: Das hat ja auch niemand behauptet.

Ja?

Nick M. schrieb:
> Dann gewöhn dir bitte gleich an statt 'unsigned long' uint32_t zu
> schreiben.
> Unsigned long ist nämlich nicht genau definiert da plattformabhängig.
> Es ist einfach schlechter Stil.

Ihm stellt uint32_t in Vergleich zu unsigned long.
Und benutzt als Kriterium die Plattformabhängigkeit.

Woraus ich geschlossen habe, dass ihm fest davon ausgeht, dass uint32_t 
eben viel besser ist, da Plattform unabhängig.
Ein Umkehrschluss ist nicht unbedingt richtig..... ok ....

Und dennoch erscheint es mir widersinnig, die Plattformabhängikeit dem 
unsigned long anzukreiden, und die Plattformabhängige Existenz des 
unit32_t auszublenden.

Mit z.B. uint_least32_t (und seinen Brüdern) habe ich keine Probleme!
Auch nicht in der Stilfrage.
uint_least32_t (und Kumpels) sollten bei jedem halbwegs modernen 
Compiler verfügbar sein.

von Roland F. (rhf)


Lesenswert?

Hallo,
Sebastian W. schrieb:
> Sich der Lüge zu zeihen oder andere persönliche Anwürfe scheinen
> inzwischen normal geworden zu sein.

Wobei es sich bei den "Bezichtigern" fast immer um den gleichen, recht 
kleinen aber lautstarken Personenkreis handelt.

> Mir fällt es zunehmend schwerer den ja fachlich interessanten Debatten
> (so wie dieser) mit Interesse zu folgen.

Du musst nur lernen derartige Anwürfe auszublenden, am besten durch 
nicht Beachtung des entsprechenden Personenkreises. Dann klappt es auch 
mit dem Erkenntnisgewinn trotz schwieriger Diskussionsumgebung. :-)

rhf

P.S.
Lothar M. schrieb:
> Und wenn es irgendein Compilerbauer in dem seither vergangenen viertel
> Jahrhundert nicht geschafft hat, diese Funktionalität zu implementieren
> (bzw. den nötigen Header mitzuliefern), dann gäbe mir das zu denken.

Dem ist nichts hinzuzufügen.

Beitrag #6562386 wurde von einem Moderator gelöscht.
von Axel S. (a-za-z0-9)


Lesenswert?

Rolf M. schrieb:

> Eigentlich ging es nur um folgende Berechnung:
>
> Franz schrieb:
>> a = 0x10000F23
>> a = (a << 3)
>
> Eine 29-Bit-CAN-ID soll um drei Bit nach links geschoben werden. Dass
> das Ergebnis nachher in ein Register geschrieben wird, ist dafür
> eigentlich gar nicht relevant.

Doch. Denn wenn uint_least32t tatsächlich länger als 32 Bit sein sollte, 
würde es bei der Zuweisung zumindest eine Warnung geben. Deswegen würde 
ich tatsächlich uint_32t vorziehen.

Den Fall, daß es das nicht gibt, können wir getrost als akademisch 
betrachten. Das Target ist AVR, da gibts das auf jeden Fall.

von Elektry (Gast)


Lesenswert?

He Fanboy,

alles gut, Deine Beiträge hier sind gut wichtig und regen zum Nachdenken 
an. Und wer, wie ich gerade, die Diskussion von oben bis unten komplett 
ließt, stellt auch fest, dass es bereits unsachlich wurde mit:

Nick M. schrieb:
> Dann gewöhn dir bitte gleich an statt 'unsigned long' uint32_t zu
> schreiben.

Dieser "Vorschriftston" ist nunmal provokant.

Nick M. schrieb:
> Es ist einfach schlechter Stil.

Und das ist auch nicht besser. So könnte man auch behaupten (und mehr 
als eine Behauptung ist es nunmal nicht), C sei schlechter Stil.

Man kann in C plattformunabhängig programmieren, aber ureigentlich ist C 
als Hochsprache zum hardware-nahen Programmieren gedacht!

Insofern sind die uralten Definitionen aus C89 noch immer und noch viele 
Jahrzehnte guter Stil und gültig:

16 Bit <= |short| <= |int| <= |long| >= 32 Bit

Mit der Folge, dass short immer 16 Bit ist und long immer mindestens 32 
Bit.

von Elektry (Gast)


Lesenswert?

Literatur?

K&R deutsch, 2nd ed., S.36

von MWS (Gast)


Lesenswert?

Elektry schrieb:
> 16 Bit <= |short| <= |int| <= |long| >= 32 Bit

16 Bit = 32 Bit ist auch 'ne Logik.

> Mit der Folge, dass short immer 16 Bit ist und long immer mindestens 32
> Bit.8

So war's vielleicht gewollt, so steht's aber nicht da.

von Elektry (Gast)


Lesenswert?

MWS schrieb:
> Elektry schrieb:
>> 16 Bit <= |short| <= |int| <= |long| >= 32 Bit
>
> 16 Bit = 32 Bit ist auch 'ne Logik.
>
>> Mit der Folge, dass short immer 16 Bit ist und long immer mindestens 32
>> Bit.8
>
> So war's vielleicht gewollt, so steht's aber nicht da.

DAS Problem hier ist das unerträgliche Schlaumeiertum!

Mal für die einfachen Gemüter:

Setze für die drei Variablen drei Zahlen ein, so dass die Ungleichung 
wahr wird!

Ich gabe mal einen Tipp:

16 <= 16 <= 32 <= 64 >= 32,  huch, das ist ja WAHR

Oder:

16 <= 16 <= 16 <= 32 >= 3,  huch, das auch...

von Joachim B. (jar)


Lesenswert?

Sebastian W. schrieb:
> Sich der Lüge zu zeihen oder andere
> persönliche Anwürfe scheinen inzwischen normal geworden zu sein.

Arduino Fanboy D. schrieb:
> Genau die Behauptung, dass unt32_t Plattform  unabhängig ist, ist eine
> Lüge.

hmmm, ich frage mich wer sich gerade und wieder mal im Ton vergreift!

Dem C-Compiler und Quelltextlesern nun mal klar und deutlich zu sagen 
welche Bitbreite man sich umgesetzt wünscht kann doch keine Lüge sein.
Ob es Sinn hat oder Bytes spart ist Sache der Maschine, aber wer nur 16 
Bit im Wertebreich braucht der muss nicht überall 32 oder mehr Bit 
vorsehen, mal wird es schlanker im Programm umgesetzt mal nicht, aber im 
Quelltext ist es verständlich unabhängig vom Prozessor.

von Nick M. (Gast)


Lesenswert?

Elektry schrieb:
> Nick M. schrieb:
>> Dann gewöhn dir bitte gleich an statt 'unsigned long' uint32_t zu
>> schreiben.
>
> Dieser "Vorschriftston" ist nunmal provokant.

Was ist an "bitte" provokan? Hätte man noch ein "!" anhängen sollen? 
Warum hat sich der TO dann dafür bedankt, statt rumzupöbeln?

Elektry schrieb:
> Literatur?
> K&R deutsch, 2nd ed., S.36

Kommentar dazu?

Nick M. schrieb:
> Nochdazu ist das mit unsigned char, long, ... dermaßen angestaubter C&R
> Stil, dass ich nur mal dezent empfehlen kann aktuelle Programme
> anzusehen. Nach bald 50 Jahren C kann man das schon mal verlangen.

Ja, das sollte K&R heißen. :-)
Ich hab meinen K&R vor über 20 Jahren weggeworfen. Warum? Verstaubtes 
Wissen, kein Wort von neueren C-Versionen. So sieht Fortbildung nicht 
aus, die jeder Arbeitgeber verlangt.

Elektry schrieb:
> Mit der Folge, dass short immer 16 Bit ist und long immer mindestens 32
> Bit.

Gebetsmühle:
Es geht um exakte Längen. Also Längen die immer gleich sind. Das 
heisst nicht mal länger oder mal kürzer. Und das auf jeder Plattform. 
Und wenn die Plattform die Länge nicht hat, dann ist sie ungeeignet, 
weil man ausdrücklich die Länge fordert.

von Einer K. (Gast)


Lesenswert?

Joachim B. schrieb:
> Dem C-Compiler und Quelltextlesern nun mal klar und deutlich zu sagen
> welche Bitbreite man sich umgesetzt wünscht kann doch keine Lüge sein.
> Ob es Sinn hat oder Bytes spart ist Sache der Maschine, aber wer nur 16
> Bit im Wertebreich braucht der muss nicht überall 32 oder mehr Bit
> vorsehen, mal wird es schlanker im Programm umgesetzt mal nicht, aber im
> Quelltext ist es verständlich unabhängig vom Prozessor.

unsigned long ist ein Datentype, welcher auf jeder Plattform zur 
Verfügung steht.
Garantiert.
Auch garantiert mindestens 32 Bit breit.

Für uint32_t gibt es noch nicht mal die Garantie auf Existenz.

Und jetzt sage du mir, welcher der beiden Typen ist weniger 
Plattformabhängig?

von Sebastian W. (wangnick)


Lesenswert?

Arduino Fanboy D. schrieb:
> Und jetzt sage du mir, welcher der beiden Typen ist weniger
> Plattformabhängig?

Beide! Der eine hat keine garantierte Länge, der andere existiert nicht 
garantiert. Es gibt keinen garantiert existierenden garantiert 32-bit 
grossen Integer-Datentyp in C99.

Zumindest lese ich den Standard so.

LG, Sebastian

von Nick M. (Gast)


Lesenswert?

Joachim B. schrieb:
> hmmm, ich frage mich wer sich gerade und wieder mal im Ton vergreift!

Und dafür gibt es natürlich zwei Minuspunkte.
Die restliche, richtige und vernünftige (gefühlt) 100ste Erklärung 
eingeschlossen.

Bei diesen Bewertungen können nur Zweifel an der fachlichen Kompetenz 
von mindestens 2 selbsternannten Schiedsrichtern aufkommen.

von Arno (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> unsigned long ist ein Datentype, welcher auf jeder Plattform zur
> Verfügung steht.
> Garantiert.
> Auch garantiert mindestens 32 Bit breit.
>
> Für uint32_t gibt es noch nicht mal die Garantie auf Existenz.
>
> Und jetzt sage du mir, welcher der beiden Typen ist weniger
> Plattformabhängig?

Nach der Definition von 99% aller Programmierer im hier gegebenen 
Kontext von Bit-Schiebe-Operation, deren Ergebnis auf Hardware 
ausgegeben wird, bei dem es also auf eine exakte Länge ankommt:

Der zweite. Denn wenn der nicht existiert, kompiliert das Programm nicht 
und es gibt eine Fehlermeldung.

Im Gegensatz dazu bekommst du, wenn du unsigned long verwendest und 
davon ausgehst, es wird schon genau 32 Bit haben, wahrscheinlich 
hässliche Laufzeitfehler der Klasse "Ariane 5 Erstflug" - zum Glück 
meist nicht so teuer.

MfG, Arno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Arduino Fanboy D. schrieb:
> uint32_t wird implementiert, wenn der Prozessor/Compiler das von Hause
> aus kann.
> Sonst nicht.

Was sollte ein µC mit einem 32-Bit-CAN-Register, wenn er es von zu Hause 
nicht kann?

Bleib einfach bei der Aufgabenstellung: Es ist ein 32-Bit-Register 
anzusprechen. Dafür ist uint32_t der richtige Datentyp.

Ich wette mit Dir, dass Du keinen µC finden wirst, der 32-Bit-Register 
hat, aber für den kein uint32_t implementiert ist. Dann wäre der 
C-Compiler für diesen µC schlicht unbrauchbar.

: Bearbeitet durch Moderator
von Einer K. (Gast)


Lesenswert?

Arno schrieb:
> Der zweite. Denn wenn der nicht existiert, kompiliert das Programm nicht
> und es gibt eine Fehlermeldung.
Das nennt man dann Plattform Unabhängigkeit!
Oder ist es gar eine Abhängigkeit?

Alternativ, könnte man auch einen anderen Prozessor, oder Toolchain, 
verwenden.
Hat aber auch, so wie ich das sehe, nichts mit Plattform Unabhängigkeit 
zu tun.


Arno schrieb:
> Im Gegensatz dazu bekommst du, wenn du unsigned long verwendest und
> davon ausgehst, es wird schon genau 32 Bit haben, wahrscheinlich
> hässliche Laufzeitfehler ..
Das lässt sich abhandeln....

> unsigned long verwendest und
> davon ausgehst, es wird schon genau 32 Bit haben
Wer davon ausgeht, sollte sich evtl. ein anderes Buch anschaffen.

von Roland F. (rhf)


Lesenswert?

Hallo,
Elektry schrieb:
> Mit der Folge, dass short immer 16 Bit ist...

und

Elektry schrieb:
> Literatur?
>
> K&R deutsch, 2nd ed., S.36

Quelle:
Programmieren in C, Zweite Ausgabe  ANSI C,
Kapitel 2.2 Datentypen und Speicherbedarf, Seite 36
Zitat:
----------
"Mit short und long sollen verschieden lange ganzzahlige Werte zur 
Verfügung stehen, soweit dies praktikabel ist; int wird normalerweise 
die "natürliche" Größe für eine Maschine sein. short belegt oft 16 
Bits, long 32 Bits und int entweder 16 oder 32 Bits. Es steht jedem 
Übersetzer frei, sinnvolle Größen für seine Maschine zu wählen, nur mit 
den Einschränkungen, daß short und int wenigstens 16 Bits haben, 
long mindestens 32 Bits, und daß short nicht länger als int und 
int nicht länger als long sein darf."
----------
Zitat Ende

Da steht nichts von " short sind immer 16 Bits".

rhf

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nick M. schrieb:
> Elektry schrieb:
>> Nick M. schrieb:
>>> Dann gewöhn dir bitte gleich an statt 'unsigned long' uint32_t zu
>>> schreiben.
>> Dieser "Vorschriftston" ist nunmal provokant.
> Was ist an "bitte" provokan? Hätte man noch ein "!" anhängen sollen?
Du hättest auch so was schreiben können:
>>>> Als Tipp: nimm statt des 'unsigned long' einen uint32_t.
Weniger Worte, weniger "unterschwellig agressiv".


Arduino Fanboy D. schrieb:
> Also mein Buch sagt:
>> provided only if the implementation directly supports the type
Korrekt: https://en.cppreference.com/w/cpp/types/integer
> Es gibt also keine Pflicht das zu implementieren.
Lass mal das "only" aus dem Text weg.
Dann steht da: wenn die Hardware die Datenbreite unterstützt und 
bearbeiten kann, dann gibt es den entsprechenden Datentyp auch.

Natürlich gibt es bei einem Prozessor, der z.B. keine einzelnen Bytes 
bearbeiten kann, dann auch keine uint8_t und keinen int8_t. Und das ist 
allemal besser, als wenn der Compiler aus den (unsigned) char dann 
eigenhändig 16 Bit nimmt und das hinterher garantiert irgendwo zur 
Laufzeit knirscht.

Arno schrieb:
> Denn wenn der nicht existiert, kompiliert das Programm nicht und es gibt
> eine Fehlermeldung.
Das wäre mir auch lieber, als wenn der Compiler in diesem Fall nach 
Gutdünken "das Beste draus macht".

: Bearbeitet durch Moderator
von Nick M. (Gast)


Lesenswert?

Ein long kann, abhängig von der Plattform eine unterschiedliche Länge 
und damit Wertebereich haben. Das nennt man dann plattformabhängig.

Ein long auf einer 64 Bit-CPU hat mehr Bits als auf einer 8 Bit CPU. 
Code, der sich implizit auf die Länge auf der 64 Bit-CPU verlässt wird 
auf 8 Bit nicht funktionieren. Also Plattformabhängig sein.

Eine Library für Verschlüsselung muss die exakten Längen der Typen 
wissen und auch ausdrücklich angeben um Plattformunabhängig zu sein.
Man könnte natürlich abhängig von der Plattform und dem Compiler und 
einiger geschickter #defines die bereits existierenden typen aus stdint 
nachbauen. Das müsste man dann für jede existierende Kombination von 
Plattform und Compiler machen. Man ist also Plattformabhängig.

von Elektry (Gast)


Lesenswert?

Frank M. schrieb:
> Bleib einfach bei der Aufgabenstellung: Es ist ein 32-Bit-Register
> anzusprechen. Dafür ist uint32_t der richtige Datentyp.

Und unsigned long ist genauso richtig. Zudem ist äußerst 
unwahrscheinlich, dass in den nächsten Jahrzehnten auf einem 8-Bit AVR C 
mit 64-Bit-Möglichkeit zur Verfügung gestellt wird.

Wir sind hier bei hardware-naher Programmierung. Bevor ein 20 Jahre 
altes AVR Programm portiert wird, programmiert man es neu.

von Einer K. (Gast)


Lesenswert?

Frank M. schrieb:
> Bleib einfach bei der Aufgabenstellung: Es ist ein 32-Bit-Register
> anzusprechen. Dafür ist uint32_t der richtige Datentyp.
Sage ich doch!
Auf dem kleinen AVR-Gcc Teller ist das alles ok.
Aber dann bitte nicht von "Plattform Unabhängig" sprechen.
Denn das ist es nicht.

Merke:
Der Streit dreht sich nicht um: "Was ist das Beste im AVR Umfeld?"

Frank M. schrieb:
> Ich wette mit Dir, dass Du keinen µC finden wirst, der 32-Bit-Register
> hat, aber für den kein uint32_t implementiert ist. Dann wäre der
> C-Compiler für diesen µC schlicht unbrauchbar.

Naja.....
[c]
unsigned long test = 4711;
PORTB = test;
[c]
Ich schätze mal, dass auch dein Compiler das ohne Murren durch lässt.
Ohne Laufzeitfehler.
Klar, es verfallen ein paar Bit, aber das tut doch keinem weh.
-- ja, ich weiß, der Vergleich hinkt etwas --

von Elektry (Gast)


Lesenswert?

Elektry schrieb:
> Insofern sind die uralten Definitionen aus C89 noch immer und noch viele
> Jahrzehnte guter Stil und gültig:
>
> 16 Bit <= |short| <= |int| <= |long| >= 32 Bit
>
> Mit der Folge, dass short immer 16 Bit ist und long immer mindestens 32
> Bit.

Hier steht nicht:

Roland F. schrieb:
> " short sind immer 16 Bits"

Hier steht, dass die Folge der Definition von K&R war, dass 
nachfolgend entwickelte Compiler immer 16 Bit für short verwendeten.

von Nick M. (Gast)


Lesenswert?

Lothar M. schrieb:
> Weniger Worte, weniger "unterschwellig agressiv".

Und dann beklagst du dich, dass das ein Kindergarten ist, forderst aber, 
jeden wie ein Kind anzufassen? Soll ich ein laktosefreies veganisches 
Eis an meine Postings pappen damit auch jeder sich inkludiert fühlt? 
Soll ich alle Geschlechter durchdeklinieren? Soll ich eine türkische 
Übersetzung mitliefern? Soll ich Sonntags nicht mehr schreiben weil das 
Leute von der Sonntagsru ... oh Mist! Was ist mit Freitag? Soll ich so 
lange schwammig formulieren, bis jeder alles reininterpretieren kann, 
auch das Gegenteil?

Sind schon wieder zu viele Personalpronomen dabei. Arme Welt.

von Elektry (Gast)


Lesenswert?

D.h. es gibt durchaus alte Programme, bei denen das nicht so ist. Es gab 
ja auch damals "verbreitete" CPUs mit 18 Bit u.s.w.

von Elektry (Gast)


Lesenswert?

Nick, kannst Du nicht einfach Deine Beiträge am Anfang als off-topic 
markieren, dann liesst man sie nicht aus Versehen?

Das ist wirklich als höfliche Bitte gemeint, damit man Dich nicht 
blacklisten muss, denn Du trägst ja inhaltlich auch Interessantes bei

von Rolf M. (rmagnus)


Lesenswert?

Der ganze Streit, was nun plattformabhängig ist und was nicht, 
resultiert meiner Ansicht nach daraus, dass hier tatsächlich zwei 
verschiedene Definitionen davon zugrunde liegen. Und die habe ich auch 
in der Vergangenheit schon öfters gesehen.
Das einie ist die, die den Ideen hinter C zugrunde liegt, die andere ist 
die, wie sie es sie soweit ich weiß in Java gibt. Ich benenne die mal 
entsprechend, ohne dass das wertend sein soll, einfach um ihnen einen 
Namen zu geben.

Die C-Variante sieht es eher aus Sicht des Compilers bzw. der 
Zielplattform. Bestimmte Eigenschaften der Datentypen werden nicht vom 
Standard festgezurrt, sondern dem Compiler überlassen. Dadurch lässt 
sich die Sprache auf allen Plattformen sinnvoll und effizient umsetzen. 
Dafür hat der Programmierer bestimmte Garantien nicht. 
Plattformunabhängig ist das in dem Sinne, dass es eben auf allen 
Plattformen eine sinnvolle Implementation gibt. Man kann damit natürlich 
auch Software schreiben, die sich auf den Plattformen gleich verhält, 
wenn man die Typen mit bedacht wählt.

Die Java-Variante sieht das Ganze eher aus Sicht des Programmierers. int 
ist 32 Bit breit, garantiert und immer. Darauf kann ich mich verlassen. 
Allerdings bedeutet das auch, dass die Implementation dann auf bestimmen 
Architekturen suboptimal ist, und auf manchen sogar enteder gar nicht 
oder nur mit sehr umständlicher und ineffizienter Emulation umgesetzt 
ist.

unsigned long kann man nun als plattforumunabhängig im C-Sinne 
bezeichnen, uint32_t im Java-Sinne. Es hat beides seine Vor- und 
Nachteile.

von Nick M. (Gast)


Lesenswert?

Kurzgeschichte:
Der kleine  AVR und der große PC unterhalten sich miteinander per RS232. 
Der AVR schickt ihm ein long.

von Einer K. (Gast)


Lesenswert?

Lothar M. schrieb:
> Natürlich gibt es bei einem Prozessor, der z.B. keine einzelnen Bytes
> bearbeiten kann,
Hier muss ich Einspruch erheben.

Du gehst davon aus, dass ein Byte 8 Bit hat.
Die Annahme funktioniert in der Regel und auch in der Fantasie.
Aber mit der C oder C++ Definition hat das wenig zu tun.

Die spricht von dem "kleinsten zu verarbeitenden Datenobjekt".
Und das ist eben char. Welches keineswegs auf 8Bit fixiert ist.

von Stefan F. (Gast)


Lesenswert?

Nick M. schrieb:
> Das ist dieser Mist mit dem int und long und ...
> Ein int ist 2 Bytes oder 4 Bytes lang. Üblicherweise.

Nicht auf meinem PC.

Deswegen war das schon eine gute Idee, die stdint.h einzuführen. Wenn 
damit irgendwer ein Problem hat, dann geht mir das am Hintern vorbei. 
Zur Not kann er sich so eine Header Datei ja selbst erstellen.

von Elektry (Gast)


Lesenswert?

Rolf M. schrieb:
> plattformabhängig

Das Problem ist, dass viele "Programmierer" nicht genug Erfahrung haben, 
um wissen zu können, dass der Begriff in jeglicher Lesart immer eine 
Utopie war, ist und bleiben wird.

(Um diese Wahrheit zu erklären, bräuchte ich den Umfang  eines Buches, 
aber langjährige Programmierer, die oft im Laufe von 30 Jahren z.B. alle 
5 Jahre jeweils 10 Jahre alten Code warten mussten, werden mir 
zustimmen: Der Programmierstil und die Richtlinien, Normen und 
Weiterentwicklungen ändern sich so gravieren, dass es jedes Mal ein 
Riesen-Aufwand ist.

Bestes Beispiel, wer seit 10 Jahrem für Android oder iOS Apps 
entwickelt, weiss, dass keine App aus der Anfangs- oder Mittelzeit jetzt 
noch reibungslos lauffähig ist, da ist der Begriff "plattformabhängig" 
völlig absurd, da es ja nicht mal von einer Handvoll 
Betriebssystem-Versionen unabhängig ist. Wer schonmal eine App von iOS 
nach Android portieren musste, wird sich über die hohen Ansprücke der 
"plattformunabhängigkeit" totlachen)

Also, vergiss das "plattformabhängig" und schreib wenigstens so, dass es 
auf dieser Plattform in 20 Jahren noch einigermaßen zu warten sein wird. 
Das wäre schon etwas!

von Rolf M. (rmagnus)


Lesenswert?

Nick M. schrieb:
> Ein long auf einer 64 Bit-CPU hat mehr Bits als auf einer 8 Bit CPU.
> Code, der sich implizit auf die Länge auf der 64 Bit-CPU verlässt wird
> auf 8 Bit nicht funktionieren. Also Plattformabhängig sein.

Wenn man sich auf etwas verlässt, das nicht garantiert ist, hat man 
einen Fehler gemacht. Man kann mit long durchaus Code schreiben, der 
sich auf allen Plattformen gleich verhält. Mit uint32_t geht das nicht, 
weil das nicht auf allen Plattformen existiert.

Arduino Fanboy D. schrieb:
> Lothar M. schrieb:
>> Natürlich gibt es bei einem Prozessor, der z.B. keine einzelnen Bytes
>> bearbeiten kann,
> Hier muss ich Einspruch erheben.
>
> Du gehst davon aus, dass ein Byte 8 Bit hat.
> Die Annahme funktioniert in der Regel und auch in der Fantasie.
> Aber mit der C oder C++ Definition hat das wenig zu tun.
>
> Die spricht von dem "kleinsten zu verarbeitenden Datenobjekt".
> Und das ist eben char. Welches keineswegs auf 8Bit fixiert ist.

Ein char ist immer 1 Byte groß (sizeof(char) == 1). Ein Byte ist aber 
nicht unbedingt 8 Bit groß. In C ist nur definiert, dass es mindestens 8 
Bit breit ist.
Auf einem DSP, der nativ 24 Bit hat und in nichts kleinerem rechnen 
kann, könnten z.B. char, short und int 24 Bit breit sein, long 48 Bit 
und long long 72 Bit. Da gibt's dann auch kein uint8_t, uint16_t, 
uint32_t oder uint64_t. Das wäre aber auch völlig Standard-konform. Ein 
32-Bit-Typ wäre auf so einem System kaum sinnvoll umsetzbar.

von Nick M. (Gast)


Lesenswert?

Elektry schrieb:
> Nick, kannst Du nicht einfach Deine Beiträge am Anfang als off-topic
> markieren, dann liesst man sie nicht aus Versehen?

Sehr gute Idee!
Dann überlegt euch doch alle mal wer was als OT empfindet und wie hoch 
der Mindestanteil an Buchstaben in dem Teil sein muss, der je zu 
berücksichtigenden Individuum von genau jener Person als OT bewertet 
wird. Bitte unter Berücksichtigung für die Gewichtung des OT-Inhalts.
Jedes posting von mir wird dann individuell von mir mit einer Liste 
personenbezugener OT-Indizes versehen. Bei neu zustoßenden Teilnehmern, 
egal ob nur zum stänkern oder sachlich, werden ältere Postings 
selbstverständlich nachtäglich um den jeweiligen Index erweitert.

Elektry schrieb:
> Das ist wirklich als höfliche Bitte gemeint, damit man Dich nicht
> blacklisten muss, denn Du trägst ja inhaltlich auch Interessantes bei

Auch ich finde, dass wir alle für dich für ein neues C-Buch 
zusammenlegen sollten. Ich meine das auch höflich und ernst.

von Stefan F. (Gast)


Lesenswert?

Rolf M. schrieb:
> Mit uint32_t geht das nicht,
> weil das nicht auf allen Plattformen existiert.

Kannst du das konkretisieren? Welcher C Compiler unterstützt auf welcher 
Plattform den uint32_t nicht?

von Nick M. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Kannst du das konkretisieren? Welcher C Compiler unterstützt auf welcher
> Plattform den uint32_t nicht?

Wurde schon mehrfach genannt: DSP

von Stefan F. (Gast)


Lesenswert?

Nick M. schrieb:
> Wurde schon mehrfach genannt: DSP

Wenn ich einen DSP Programmiere, der nur 24bit kann, dann wird mein 
Programm auch dementsprechend aussehen. Das ist ein Spezialfall, der 
ohnehin speziell programmiert wird.

Ich versuche schließlich auch nicht mit meinem Hausahlts-Staubsauger 
eine Bäckerei zu reinigen.

von Nick M. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich versuche schließlich auch nicht mit meinem Hausahlts-Staubsauger
> eine Bäckerei zu reinigen.

Ich saug meine Wohnung mit einem Industriesauger. Das geht.
Was hat das jetzt mit deiner Frage zu tun?

von Einer K. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn ich einen DSP Programmiere, der nur 24bit kann, dann wird mein
> Programm auch dementsprechend aussehen. Das ist ein Spezialfall, der
> ohnehin speziell programmiert wird.

Wenn unsigned long verwendet wird, hat man einen Datentype, welcher min. 
32 Bit verarbeiten kann. Auf jedem C/C++  Kesselchen dieser Welt.
Das nenne ich Plattformübergreifend.

Wenn man uint32_t verwendet, hauts einem das manchmal um die Ohren.
Das nenne ich, von der Plattform abhängig sein.

Tipp:
Mit Staubsaugern hat das nichts zu tun.

Beitrag #6562722 wurde von einem Moderator gelöscht.
Beitrag #6562732 wurde von einem Moderator gelöscht.
von J. -. (Gast)


Lesenswert?

Es ist eine Sauerei, daß man nach 3 mal nach links schieben eine höhere 
Zahl bekommt. Jeder weiß, daß man nach 3 mal links gehen um einen Block 
wieder an der Ausgangsposition ankommt. Also müßte das Null ergeben. Ich 
finde es schlimm, wie der TO hier verwirrt wird.

Zudem muß ich bemängeln, daß die Diskussion mit den Personalpronomen 
nicht zu Ende geführt wurde. Prinzipiell war es eine kleine Teilmenge 
der gewaltfreien Kommunikation, die hier zur Sprache kam.
Es ist nunmal ein Unterschied, ob man sagt: "Ich finde, euch sollte man 
alle verdreschen", oder nur "Euch sollte man alle verdreschen". Das 
Voransetzen eines "Ich finde/meine/denke" entschärft aggressive 
Allgemeinplätze, erhebt keinen Anspruch auf Allgemeingültigkeit und den 
Rest könnt ihr in der Wiki nachlesen.

Beitrag #6562743 wurde von einem Moderator gelöscht.
Beitrag #6562755 wurde von einem Moderator gelöscht.
Beitrag #6562760 wurde von einem Moderator gelöscht.
von Tomas pk (Gast)


Lesenswert?

Was lobe ich mir das Freepascal/Lazarus /Delphi.

Auffällig ist, das es solche Grundsatzdiskussionen ständig in C Foren 
gibt

Beitrag #6562787 wurde von einem Moderator gelöscht.
Beitrag #6562792 wurde von einem Moderator gelöscht.
Beitrag #6562794 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Es ist eine Sauerei, daß man nach 3 mal nach links schieben eine höhere
> Zahl bekommt. Jeder weiß, daß man nach 3 mal links gehen um einen Block
> wieder an der Ausgangsposition ankommt. Also müßte das Null ergeben. Ich
> finde es schlimm, wie der TO hier verwirrt wird.

kannst du das nochmal neu formulieren, so dass man ohne Verwirrung 
verstehen kann, was du meinst?

von Stefan F. (Gast)


Lesenswert?

> Auffällig ist, das es solche Grundsatzdiskussionen
> ständig in C Foren gibt

Das stimmt. Dafür diskutieren die Java Entwickler gerne über 
Quelltext-Formatierung und welches Framework die Welt regieren soll.

Beitrag #6562820 wurde von einem Moderator gelöscht.
von J. -. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> kannst du das nochmal neu formulieren, so dass man ohne Verwirrung
> verstehen kann, was du meinst?
Nimm's am besten nicht allzu ernst, auch wenn es noch so schlimm ist :-)

von Elektry (Gast)


Lesenswert?

Das Tolle ist doch, dass die Anfangsfrage schon nach wenigen Antworten 
vollständig beantwortet worden ist. Hat man auch nicht so oft.

Viel häufiger beginnt das hier so früh, dass es nicht mehr zu einer 
brauchbaren Antwort kommt.

Ein C Buch schreiben? Ich weiß, dass ich nichts weiss.

von J. -. (Gast)


Lesenswert?

Elektry schrieb:
> Das Tolle ist doch, dass die Anfangsfrage schon nach wenigen Antworten
> vollständig beantwortet worden ist. Hat man auch nicht so oft.
Eben. Und danach ging es wieder darum, wer mit dem Längsten am besten 
kann. Nur noch Schweinkram.

von MWS (Gast)


Lesenswert?

Elektry schrieb:
> MWS schrieb:
>> Elektry schrieb:
>>> 16 Bit <= |short| <= |int| <= |long| >= 32 Bit
> DAS Problem hier ist das unerträgliche Schlaumeiertum!
> Mal für die einfachen Gemüter:

Also schrubst Du jetzt diese Antwort nur für Dich selbst?

> Setze für die drei Variablen drei Zahlen ein, so dass die Ungleichung
> wahr wird!

Wir reden hier über den Wertebereich von Datetypen.

> 16 <= 16 <= 32 <= 64 >= 32,  huch, das ist ja WAHR
> Oder:
> 16 <= 16 <= 16 <= 32 >= 3,  huch, das auch...

Da Du Schlaumeier alle Typen auch mit "=" verknüpft hast, ist die 
Aussage Deiner "Formel", dass der Wertebereich aller Typen auch gleich 
kann, was natürlich grandioser Unsinn ist.

Verstehst Du das jetzt, oder soll ich langsamer für Dich schreiben?

von Einer K. (Gast)


Lesenswert?

MWS schrieb:
> Da Du Schlaumeier alle Typen auch mit "=" verknüpft hast, ist die
> Aussage Deiner "Formel", dass der Wertebereich aller Typen auch gleich
> kann, was natürlich grandioser Unsinn ist.
Du erstaunst mich...
Ich rate dir zu einem guten Buch.

Natürlich dürfen alle fundamentalen integer Typen gleich viel Bit breit 
sein.

Ob das in der Praxis auch so ist, ist eine andere Frage.
Aber sie dürfen.

Der Wertebereich unterscheidet sich natürlich zwischen signed und 
unsigned. Da spielt auch noch mit rein, ob Einerkomplement oder 
Zweierkomplement .

von Arno (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wenn man uint32_t verwendet, hauts einem das manchmal um die Ohren.
> Das nenne ich, von der Plattform abhängig sein.

Du kannst auch die Farbe des Mittagshimmels grün nennen, aber wundere 
dich nicht, wenn man dich dann nicht mehr versteht.

MfG, Arno

von MWS (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ich rate dir zu einem guten Buch.

Und ich rate dazu, dass Du nur darauf antwortest, was Du inhaltlich 
verstanden hast.

> Natürlich dürfen alle fundamentalen integer Typen gleich breit sein.

Das war nicht das Thema.

von Einer K. (Gast)


Lesenswert?

MWS schrieb:
>> Natürlich dürfen alle fundamentalen integer Typen gleich breit sein.
>
> Das war nicht das Thema.

Ja?
Elektry (Gast) sprach nur über die Breiten!
Oder?

Beitrag #6562915 wurde von einem Moderator gelöscht.
Beitrag #6562948 wurde von einem Moderator gelöscht.
Beitrag #6563030 wurde von einem Moderator gelöscht.
Beitrag #6563035 wurde von einem Moderator gelöscht.
Beitrag #6563049 wurde von einem Moderator gelöscht.
Beitrag #6563055 wurde von einem Moderator gelöscht.
Beitrag #6563066 wurde von einem Moderator gelöscht.
Beitrag #6563068 wurde von einem Moderator gelöscht.
Beitrag #6563069 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.