Japprenais à programmer pour un robot à obstacle vide mais quand jai regardé le code Jai vu deux types de données long et int.
Int sont des types de données qui contiennent de -2 147 483 648 à 2 147 483 647. Long sont également des types de données qui contiennent de -2 147 483 648 à 2 147 483 647.
Int et long sont identiques, mais jai trouvé le code où deux types de types de données sont utilisés comme indiqué ci-dessous:
int trigPin = 2; int echoPin = 4; long duration, cm, inches;
Mais comment savoir quand utiliser quel type de données? Jai beaucoup cherché sur le Web, mais je nai pas compris, alors quelquun peut-il mexpliquer cela sil vous plaît.
Commentaires
- » Int sont des types de données contenant de -2 147 483 648 à 2 147 483 647 » Où avez-vous entendu cela?
Réponse
Sur lArduino (modèles AVR), un int
est de 16 bits et non de 32 bits. Cela va donc de -32768 à +32767.
Soit différent de long
qui est 32 bits.
Commentaires
- Quelles sont les largeurs de
int
etlong
sur les Arduinos ARM 32 bits tels que Due? - Je pense sur le Due quun
int
est 32 bits, identique àlong
. Voir ici par exemple.
Réponse
int
dans AVR GCC est 16 bits , pas 32.
Réponse
Selon la spécification du langage C , int
doit être dau moins 16 bits ou plus et long
doit être dau moins 32 bits ou plus.
Il est normal quun compilateur implémente int
en 32 bits ou même en 64 bits. Un compilateur peut implémenter long
en 64 bits ou plus. Mais il nest pas permis à un compilateur dimplémenter long
en 16 bits.
Alors, quand utiliser quel type?
Si les valeurs vous allez travailler avec peut être représenté en 16 bits, alors vous pouvez utiliser int
. Si vous avez besoin de plus de 16 bits, utilisez long
. Si vous avez besoin de plus de 32 bits, utilisez long long
.
Ne vous laissez pas entraîner par les spécificités du compilateur et / ou du processeur. Comme mentionné par dautres, même dans la même gamme de produits, Arduinos, il y a des processeurs 16 et 32 bits disponibles. Au lieu de cela, ne faites confiance quaux garanties standard.
Les spécifications complètes des types en C sont:
-
char
doit être dau moins 8 bits -
int
doit être dau moins 16 bits -
long
doit être au moins 32 bits -
long long
doit être au moins 64 bits
Remarque: Il est parfaitement légal pour les compilateurs dimplémenter char, int, long et long long en 64 bits. Ce nest en fait pas rare parmi les DSP.
Commentaires
- Aussi: Lisez la documentation de votre compilateur
- Et:
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
selon la norme. Donc, siint
est de 64 bits, alorslong
doit également être dau moins 64 bits.
Réponse
Cest le même raisonnement quen C: la taille du type int
est attendue être la taille de mot naturelle que votre système gère le plus efficacement . Elle doit également avoir au moins 16 bits de largeur, pas plus petit quun short
, et pas plus grand quun long
.
Ainsi, un int
peut être basé sur 16, 32 ou 64 bits sur tout ce que votre système gère le mieux, et donc probablement 16 bits de large sur un processeur 8 ou 16 bits, 32 sur un processeur 32 bits, etc.
Jutilise int
quand je veux les meilleures performances, tout en prenant soin de me garder quand jai besoin de plus de portée que celle offerte par 16 bits. De nos jours, vous avez tendance à savoir quand vous écrivez le code dapplication pour les systèmes 16 bits, bien que ce ne soit pas si vrai pour le code de «bibliothèque» où la portabilité peut être plus grande préoccupation.
Dans votre exemple, en supposant que lauteur ait choisi leurs types avec soin, les variables int
nécessitent probablement une petite plage et pourraient se permettre dêtre de la taille dun mot , conduisant à un code potentiellement plus court ou plus rapide (ou les deux). Les long
nécessitaient probablement une plage de plus de 16 bits (ils sont garantis davoir au moins 32 bits de large). Sur le processeur que vous avez sélectionné comme cible de compilation, il semble que int
et long
ont tous deux été implémentés en 32 bits; ce serait être différent (ou devrait être) si vous avez sélectionné un processeur cible 16 bits.
Réponse
Jaime utiliser des types de stdint.h
.
Bien quils aient des inconvénients mineurs, lavantage quils offrent est que vous savez exactement la taille que vous manipulez, même lors de la compilation sur dautres architectures.
#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.
Mais évidemment, vous ne voulez pas vous déplacer dans un tas de int32_t lorsque vos données nont besoin que de int16_t.
Commentaires
- Donc, ne pas utiliser de mot machine na pas dimpact sur les performances de lAVR?
- @Ren é – En général, ne pas utiliser la taille des mots peut avoir un impact sur les performances de la plupart des processeurs. Mais traditionnellement, les processeurs AVR ont des registres 8 bits & avec des instructions 16 bits pour les opérations de pointeur. Ainsi, lorsque je programme, je lance le code en premier, puis optimise la vitesse si il ‘ est trop lent.
- @Ren é – Mais si vous voulez vraiment être pédant à ce sujet, vous pouvez utiliser
word
comme type de données. Il sagit de 16 bits sur Arduino Uno et de 32 bits sur Arduino Due & Zero. Mais cela revient au problème de ne connaître vraiment que la taille minimale de votre type de données. Supposons que vous utilisiezword
sur du code Due, mais que vous souhaitiez ensuite effectuer un back-portage vers Uno?! Utiliser uint32_t à la place résoudrait ce problème avant quil ne commence, mais oui, la taille des mots sera sous-optimale sur Uno. Quen est-il des futures cartes Arduino … quelle taille de mot auront-elles? 32? 64? 128 !? - OK. Donc jutiliserais la taille du mot machine (int? WORD semble être une définition de type Windows obsolète) si la limite inférieure est suffisante, je ne me soucie pas de la taille de la mémoire et jai besoin de la vitesse, * _t si je me soucie de la taille?
- supprimer ce … gnu.org/software/libc/manual/html_node/Integers.html dit
*fast*_t
semble être la voie à suivre …