passt, weil der Wert <= 65.535 (2^8) ist. Der Zusatz UL ist hier falsch und absolut unnötig.
kommt zum Überlauf, soll heißen, die nächste Zahl nach 65.535 ist 0. Hier hat UL auch nichts zu suchen.
passt,weil der Wert <= 4.294.967.295 (2^32) ist. UL ist auch hier ebenfalls unnötig und fehl am Platze.
Lege dir mal ein Programmierhandbuch, vorzugsweise für C zu. Dort wird sowas bereits in den Basics erklärt. Andernfalls gibt es genügend Hilfestellungen auch im Netz.
UL solltest du für Textergänzungen des Compilers lediglich nutzen.
beginner34:
wird der Wert nicht mit UL automatisch zur unsigned long? auch wenn er ein int ist?
Kann man ein Kaninchen aus einem Hut zaubern?
Also das mit dem Kaninchen habe ich schon gesehen.
Aber wenn Du "static unsigned int" deklarierst, dann ist das auf einem 8-Bit AVR immer eine 16-Bit Variable, die Du deklarierst. Und wenn Du überschießende Bits von beispielsweise einer 32-Bit Konstanten an die 16-Bit Variable zuweist, bleibt die 16-Bit Variable trotzdem immer noch eine 16-Bit Variable. Und verwandelt sich dabei nicht in ein Kaninchen (oder eine 32-Bit Variable).
Links und rechts vom Gleichheitszeichen muss der passende Typ sein.
Hier hast du zwar rechts ein unsigned long ( 180000UL ) das wird aber einer 16-Bit Variable zugewiesen.
Nimm den Windows-Taschenrechner: View: Programmer, Dec, Dword und tippe "6000 * 30 =" ein.
Dann ändere Dword -> Word und bewundere, wie aus 180000 -16608 wird. Viel Spass. ( Leider kann der Windows Taschen-Rechner kein "unsigned", und leider hab ich ein englisches Exemplar )
Danke für die Antworten.
Ich habe mehrere Arduino Bücher, und ja , auch gelesen !
Mit dem UL hinter dem Wert, habe ich hier aus dem Forum. Mir sind 16Bit, 8Bit,.... bekannt, nur war mir nicht klar, warum ich dann noch hinter dem Wert (zB: 10000UL) noch ein UL setzen muss, wenn doch in der Deklaration der Datentyp steht.
Das ich am Anfang den falschen Datentyp verwendet habe ist mir erst später aufgefallen und deswegen wollte ich wissen, wie der zusammenhang ist.
beginner34:
nur war mir nicht klar, warum ich dann noch hinter dem Wert (zB: 10000UL) noch ein UL setzen muss, wenn doch in der Deklaration der Datentyp steht.
Wo das wirklich wichtig ist bei solchen Sachen:
unsigned long var = 1000UL * 10;
Da ist das unbedingt nötig, da sonst in int gerechnet wird
Wobei die Größe von int Plattform-abhängig ist. Auf einem 8-Bit Prozessor ist int 16 Bit. Auf einem 32 Bit Prozessor (wie dem Due z.B.) ist int auch 32 Bit groß. Da ist der 16 Bit Datentyp short
Auf einem 32 Bit Prozessor (wie dem Due z.B.) ist int auch 32 Bit groß.
Ja, aber auch da richtet ein UL (meist) keinen Schaden an, auch wenn dann in 64Bit gerechnet wird.
Diese Rechenoperationen werden im Compiler durchgeführt. Im Code landet nur das Ergebnis.
Es ist eine Compiezeit Operation.
Keine Laufzeit Operation.
(Vielleicht ändert das ja den Blickwinkel)
ärgere Dich nicht beginners34, über solche Sachen stolpere ich auch.
Eigentlich sollte dem Compiler klar sein was er machen muß, auch ohne den Hinweis UL.
Sowas muß man sich merken und gut ist.
dann wird es aber mal Zeit das zu ändern im 21. Jahrhundert.
Ist doch eine Compilersache, hat doch in Sinne nichts direkt mit C zu tun.
Schlimm genug das wir uns mit Bits und Bytes rumärgern müssen.
bei meinen Timer Registern mach ich bald nichts mehr freiwillig zum Spass.
Immer wenn ich denke ich habe die Logik durchschaut, klappt's nicht.
Ich glaube ich nehme mir eine Auszeit ...
Egal, welche Sprache/Baustein, man muss das dahinter stehende Konzept verstanden haben.
Dann geht das...
Ein bisschen auswendig lernen ist auch nicht schlecht.
Und:
Dass ein Feature in dieser da ist, und in der anderen eben nicht, macht den Charakter einer Sprache aus.
Es gibt viel schlimmere(leider wertend) Dinge als L und UL.
z.B.: Mehrfachvererbung, friends, ...
Ganz schlimm, ist für mich, das fehlende Interface Konzept.
Naja....
Man kann auch Spaß an sowas entwickeln..
Und dann berühren einen die Besonderheiten einer Sprache gar nicht so negativ.
combie:
Ganz schlimm, ist für mich, das fehlende Interface Konzept.
Kann man durch abstrakte Klassen (d.h. Klassen die nur rein virtuelle Methoden enthalten) und bei Bedarf Mehrfachvererbung nachbilden. Mit virtueller Vererbung kann man dabei auch die üblichen Probleme der Mehrfachvererbung umgehen.
Ja, man kann alles tun, wenn man nur genügend will...
Meine gnadenlose C(C++) Verweigerung habe ich schon vor einiger Zeit abgelegt...
Auch wenn mir noch einiges sehr umständlich erscheint.
Objekt Methoden als ISR... (static only?!?!)
Callbacks auf Objekt Methoden. (Subject/Observer Design Pattern)
Aber auch dieses ist alles machbar!
Manchmal reicht es den Blickwinkel zu ändern, und manchmal muss man einen dazwischen schieben...