web-dev-qa-db-fra.com

Embedded c: Qu'est-ce que VAR = 0XFF; faire?

Je travaille avec Embedded c pour la première fois. Bien que mon C soit rouillé, je peux lire le code mais je n'ai pas vraiment de saisir pourquoi certaines lignes sont commees. Par exemple, je veux savoir si une variable est vraie ou false et renvoyez-la à une autre application. Plutôt que de définir la variable à 1 ou 0, la mise en œuvre d'origine a choisi 0xFF.

Essaie-t-il de le mettre dans un espace d'adressage? ou bien pourquoi définir une variable booléenne pour être 255?

19
Dan

0xFF Définit tous les bits dans un caractère.

La mise en œuvre initiale a probablement décidé que la norme 0 et 1 n'était pas assez bon et décidé que si tous les bits OFF est faux alors tous les bits ON est vrai .

Cela fonctionne parce que dans C une valeur d'autre que 0 est vrai. Bien que cela établisse tous les octets dans un caractère, il fonctionnera également pour tout autre type de variable, car tout bit étant défini dans une variable le rend vrai.

31
QuantumPete

Si vous avez des besoins désespérés de mémoire, vous voudrez peut-être stocker 8 booléens dans un octet (ou 32 dans un long, ou autre)

Cela peut facilement être fait en utilisant un masque de drapeau:

  // FLAGMASK = ..1<<n for n in 0..7...
  FLAGMASK = 0x10;    // e.g. n=4

  flags &= ~FLAGMASK; // clear bit
  flags |= FLAGMASK;  // set bit
  flags ^= FLAGMASK;  // flip bit
  flags = (flags & ~FLAGMASK) | (booleanFunction() & FLAGMASK); // clear, then maybe set

cela ne fonctionne que lorsque booleanfunction () renvoie 0 (tous les bits clairs) ou -1 (tous les bits définis).

12
mfx

0xFF est la représentation hexagonale de ~ 0 (i.e. 11111111)

Dans, par exemple, VB et accès, -1 est utilisé comme vrai.

9
Cade Roux

Souvent, dans des systèmes intégrés, un programmeur qui écrit tout le code et ses idiosyncrasies sont tout au long de la source. De nombreux programmeurs intégrés étaient des ingénieurs HW et devaient obtenir un système de fonctionner de mieux qu'ils le pouvaient. Il n'y avait aucune exigence ni concept de "portabilité". Un autre examen des systèmes intégrés est le compilateur est spécifique pour la CPU HW. Reportez-vous au ISA pour cette CPU et vérifiez toutes les utilisations du "Boolean".

4
humble_guru

Ce qui est vraiment important de savoir à propos de cette question est le type de "var". Vous dites "Boolean", mais est-ce que la Bool de C++/C99 est-elle (très probable, étant une application C intégrée au C), quelque chose d'un type complètement différent qui est utilisé comme booléen?

3
XPav

Comme d'autres l'ont dit, il définit tous les bits à 1. Et car cela est incorporé c, vous pouvez stocker cela dans un registre dans lequel chaque bit est important pour quelque chose, de sorte que vous voulez les mettre à tous 1. Je sais que je l'ai fait semblable lors de l'écriture dans l'assembleur.

3
Paul Tomblin

L'ajout également 1 à 0xFF le définit à 0 (en supposant que la vérification peut avoir été en boucle avec un incrément de pause.

2
Vaibhav Garg

Voici une raison probable: 0xff est le complément binaire de 0. Il se peut que sur votre architecture intégrée, stocker 0xff dans une variable est plus efficace que de stocker, disons, 1 qui pourrait nécessiter des instructions supplémentaires ou une constante stockée en mémoire.

Ou peut-être le moyen le plus efficace de vérifier la "valeur de vérité" d'un registre dans votre architecture est d'une instruction "Check Bit Set". Avec 0xff comme la vraie valeur, cela n'a pas d'importance qui bit est coché ... ils sont tous définis.

Ce qui précède n'est que des spéculations, bien sûr, sans savoir quel type de processeur embarqué que vous utilisez. 8 bits, 16 bits, 32 bits? Pic, avr, bras, x86 ???

(Comme d'autres l'ont souligné, toute valeur entière autre que zéro est considérée comme vraie aux fins des expressions booléennes à C.)

1
Dan Lenski