Différence entre le type de données int et long sur Arduino

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 et long 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, si int est de 64 bits, alors long 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 utilisiez word 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 …

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *