[Résolu] Taille des variables

Bonsoir à toutes et à tous,

Après avoir patouillé avec les “dtostre” et autre joyeusetés de conversion entre types de variables, je me suis aperçu que les types suivants : “long”, “float”, “double” et “long double” sont tous codés sur 32 bits sur mon Mega 2560 !!

Je me suis aperçu de ça avec le sketch suivant et le compilateur 1.5.7 qui donne le taux d’occupation de la mémoire dynamique :

long double x[1000];

void setup() {
  // put your setup code here, to run once:
for (int i = 0; i < 1000; i++)
  x[i] = 1*i;
}

void loop() {
  // put your main code here, to run repeatedly:

où vous pouvez mettre ce que vous voulez comme type de variable.

Vous pouvez vous en apercevoir aussi en faisant :

double x = 12345678.555555-12345678;

Vous obtiendrez 0.000000 au lieu de 0.555555

Théoriquement, les “double” sont codés sur 64 bits et les “long double” sur 80.

Je ne sais pas ce qu’il en est avec les autres processeurs.

Bon, ben suffit de le savoir :disappointed_relieved: .

Cordialement.

NOTA : par contre, si vous aviez une idée au sujet de mon post “Utilisation d’une classe définie dans un fichier annexe” … Merci d’avance :wink: .

Pierre

Oui c’est normal :
http://arduino.cc/en/Reference/long <---- tu as les mêmes liens pour toutes les variables.

Le proco sur la mega est un 8 bit , tu immagines la tortures des calculs si il doit travailler sur des variables de 80 bits :stuck_out_tongue: avec des tableaux comme celui de ton exemple x[1000]

Effectivement, c'est noté dans les références. Je ne m'étais pas donné la peine d'y regarder.

La logique aurait voulu que quelque soit le processeur, les règles du language soient respectées. Pour autant, si la charge de travail due à ce nombre important d'octets met à mal les performances du proceseur, cela semble normal d'y déroger.

Mon tableau de 1000 n'était là que pour montrer de manière évidente le nombre d'octets utilisés.

Bon, on va faire avec, ce n'est pas un problème :) .

Cordialement.

Pierre

ChPr: La logique aurait voulu que quelque soit le processeur, les règles du language soient respectées.

Exact, sauf que dans notre cas ce n'est pas un microprocesseur mais un microcontrôleur. Les deux noms ne sont pas interchangeables. :grin:

[/table]

La logique aurait voulu que quelque soit le processeur, les règles du language soient respectées. Pour autant, si la charge de travail due à ce nombre important d'octets met à mal les performances du proceseur, cela semble normal d'y déroger.

Je n'en connais pas la raison exact.

Mon tableau de 1000 n'était là que pour montrer de manière évidente le nombre d'octets utilisés.

Je m'en suis douté :P mais c’était fun de s’imaginer la Uno travaillait sur 1000 variables de 80 bits !!! " rire démoniaque "

Bonjour,

La norme C ne définit pas des tailles précises, mais donne juste des règles, comme par exemple (long >= “pas long”).
Je ne me souviens pas avoir lu qu’un double devait être codé sur 64 bits ou un long double sur 80.

Ce choix de 64 ou 80 est juste valable pour les architectures ‘x86’, et dépend de chaque implémentation.

Pour être “portable”, il ne faut jamais assumer sur la taille d’un type, il faut au préalable le tester avec sizeof().