Ich habe gelernt, für einen Void-Hindernisroboter zu programmieren, aber als ich mir den anschaute Code Ich habe zwei Datentypen gesehen, die lang und int sind.
Int sind Datentypen, die -2.147.483.648 bis 2.147.483.647 enthalten. Long sind auch Datentypen, die -2.147.483.648 bis 2.147.483.647 enthalten.
Int und Long sind gleich, aber ich habe den Code gefunden, bei dem zwei Datentypen verwendet werden, wie unten dargestellt:
int trigPin = 2; int echoPin = 4; long duration, cm, inches;
Aber wie können Sie wissen, wann welcher Datentyp verwendet werden soll? Ich habe viel im Web gesucht, aber ich habe es nicht verstanden, also kann mir das bitte jemand erklären.
Kommentare
- “ Int sind Datentypen, die -2.147.483.648 bis 2.147.483.647 enthalten. “ Wo haben Sie das gehört?
Antwort
Auf dem Arduino (AVR-Modelle) beträgt eine int
16 Bit, nicht 32 Bit. Somit geht es von -32768 bis +32767.
Das ist anders von long
, das sind 32 Bit.
Kommentare
- Wie breit sind
int
undlong
auf den 32-Bit-ARM-Arduinos wie Due? - Ich denke auf dem Due, dass ein
int
ist 32 Bit, das gleiche along
. Siehe hier zum Beispiel.
Antwort
int
in AVR GCC ist 16 Bits , nicht 32.
Antwort
Gemäß der C-Sprachspezifikation , int
muss mindestens 16 Bit oder länger sein und long
muss mindestens 32 Bit oder länger sein.
Für einen Compiler ist es in Ordnung, int
als 32 Bit oder sogar 64 Bit zu implementieren. Für einen Compiler ist es in Ordnung, long
als 64 Bit oder länger zu implementieren. Es ist einem Compiler jedoch nicht gestattet, long
als 16 Bit zu implementieren.
Wann sollte also welcher Typ verwendet werden?
Wenn die Werte Sie arbeiten mit kann innerhalb von 16 Bit dargestellt werden, dann ist es in Ordnung, int
zu verwenden. Wenn Sie mehr als 16 Bit benötigen, verwenden Sie long
. Wenn Sie mehr als 32 Bit benötigen, verwenden Sie long long
.
Lassen Sie sich nicht von Compiler- und / oder CPU-Besonderheiten einholen Für dieselbe Produktpalette, Arduinos, stehen 16- und 32-Bit-CPUs zur Verfügung. Vertrauen Sie stattdessen nur den Garantien des Standards.
Die vollständige Spezifikation der Typen in C lautet:
-
char
muss mindestens 8 Bit -
int
muss mindestens 16 Bit -
long long
muss mindestens 64 Bit - Außerdem: Lesen Sie die Compiler-Dokumentation
- Und:
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
gemäß Standard. Wenn alsoint
64 Bit beträgt, musslong
ebenfalls mindestens 64 Bit betragen.
long
muss mindestens 32 Bit
Hinweis: Es ist für Compiler völlig legal, char, int, long und long long zu implementieren als 64 Bit. Dies ist in der Tat bei DSPs nicht ungewöhnlich.
Kommentare
Antwort
Dies ist die gleiche Argumentation wie in C: Die Größe des Typs int
wird erwartet Um die natürliche Wortgröße zu sein, die Ihr System am effizientesten verarbeitet . Sie muss außerdem mindestens 16 Bit breit sein, nicht kleiner als eine short
und nicht größer als eine long
.
Eine int
kann also 16-, 32- oder 64-Bit-basiert sein auf dem, was Ihr System am besten handhabt, und daher ist es höchstwahrscheinlich 16 Bit breit auf einer 8- oder 16-Bit-CPU, 32 auf einer 32-Bit-CPU usw.
Ich verwende int
, wenn ich die beste Leistung erzielen möchte, während ich darauf achte, wenn ich mehr Reichweite als 16 Bit benötige. Heutzutage wissen Sie in der Regel, wann Sie Anwendungscode für 16-Bit-Systeme schreiben. obwohl das nicht so ist für „Bibliotheks“ -Code, wo Portabilität sein kann Größere Bedenken.
In Ihrem Beispiel erfordern die Variablen int
unter der Annahme, dass der Autor ihre Typen sorgfältig ausgewählt hat, wahrscheinlich einen kleinen Bereich und könnten es sich leisten, eine Wortgröße zu haben Dies führt zu möglicherweise kürzerem oder schnellerem Code (oder beidem). Die long
benötigten vermutlich einen Bereich von mehr als 16 Bit (sie sind garantiert mindestens 32 Bit breit). Auf dem Prozessor, den Sie als Kompilierungsziel ausgewählt haben, sieht es so aus, als ob int
und long
beide als 32-Bit implementiert wurden anders sein (oder sollte sein), wenn Sie eine 16-Bit-Ziel-CPU ausgewählt haben.
Antwort
Ich verwende gerne Typen aus stdint.h
.
Obwohl sie geringfügige Nachteile haben, bieten sie den Vorteil, dass Sie genau wissen, welche Größe Sie verarbeiten, auch wenn Sie auf anderen Architekturen kompilieren.
#include <stdint.h> uint8_t my_byte = 0xf0; int16_t trig_pin = 2; int16_t echo_pin = 4; uint32_t duration, cm , blah; uint64_t big_int; // etc.
Aber offensichtlich möchten Sie sich nicht um eine Reihe von int32_t bewegen, wenn Ihre Daten nur int16_t benötigen.
Kommentare
- Verwenden Sie also kein Maschinenwort Größe hat keinen Einfluss auf die Leistung von AVR?
- @Ren é – Im Allgemeinen kann die Nichtverwendung der Wortgröße die Leistung der meisten CPUs beeinträchtigen. Traditionell verfügen AVR-CPUs jedoch über 8-Bit-Register & Akkumulatoren mit 16-Bit-Anweisungen für Zeigeroperationen. Wenn ich also programmiere, wird der Code zuerst ausgeführt und dann auf Geschwindigkeit optimiert, wenn es ‚ ist zu langsam.
- @Ren é – Aber wenn Sie wirklich pedantisch sein wollen, können Sie es verwenden
word
als Datentyp. Dies sind 16 Bit bei Arduino Uno und 32 Bit bei Arduino Due & Zero. Dies führt jedoch zu dem Problem zurück, wirklich nur die Mindestgröße Ihres Datentyps zu kennen. Angenommen, Sie verwendenword
für einen Due-Code, möchten dann aber einen Backport auf Uno durchführen?! Die Verwendung von uint32_t würde dieses Problem lösen, bevor es gestartet wird, aber ja, die Wortgröße ist unter Uno nicht optimal. Was ist mit zukünftigen Arduino-Boards … welche Wortgröße werden sie haben? 32? 64? 128!? - OK. Ich würde also die Maschinenwortgröße verwenden (int? WORD scheint eine obselete Windows-Typdefinition zu sein), wenn die Untergrenze ausreicht. Die Speichergröße ist mir egal und ich brauche die Geschwindigkeit. * _T, wenn mir die Größe wichtig ist?
- verschrottet das … gnu.org/software/libc/manual/html_node/Integers.html sagt
*fast*_t
scheint der richtige Weg zu sein …