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
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.
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äß...
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.
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.
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
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.
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.
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.
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).
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.
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!
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
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.
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
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. :-)
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...
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.
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.
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.
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.
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.
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.
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.
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ö.
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!
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
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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
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
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!
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!
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?
[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]
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.
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.
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.
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.
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.
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...
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.
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.
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?
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
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.
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
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.
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.
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
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".
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.
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.
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 --
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.
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.
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
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.
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.
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.
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!
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.
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.
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?
Stefan ⛄ F. schrieb:> Kannst du das konkretisieren? Welcher C Compiler unterstützt auf welcher> Plattform den uint32_t nicht?
Wurde schon mehrfach genannt: DSP
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.
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?
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.
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.
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?
> 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.
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 :-)
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.
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.
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?
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 .
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
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.
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?