Opérateurs sur les entiers

On dispose d’un grand nombre d’opérateurs sur les entiers. Nous en donnons ci-après la liste (on n’a pas indiqué les opérateurs de comparaison, voir plus loin) avec des exemples dans lesquels on a supposé les initialisations suivantes :

int i = 3, j = -12;unsigned u = 35000;long l = -100000;unsigned long ul = 3000000000;

Pour comprendre ces exemples, il faut savoir que lorsqu’on fait agir dans une même opération deux entiers de même type, le résultat est de ce même type, avec troncature éventuelle, c'est-à-dire perte des bits excédentaires; par exemple, sur des entiers codés sur 32 bits, tous les calculs sont effectués modulo 232.

Si l’on fait agir deux entiers de types différents, les entiers signés sont convertis en non-signés si nécessaire, et les courts en plus long afin que les deux types soient les mêmes. Par exemple, si j et u interviennent ensemble, j est transformé en entier non-signé (ce qui donne 65524). Si j et l interviennent ensemble, j est transformé en long (et reste donc -12). Si j et ul interviennent ensemble, j est transformé en unsigned long (ce qui donne 4 294 967 284). Enfin si u et l interviennent ensemble, u est converti en long. Toutes ces conversions sont indépendantes du type du résultat.

Les opérateurs sur les entiers agissent de gauche à droite, c'est-à-dire que l’opérande de gauche est évalué en premier. Ils ont en outre une priorité correspondant à l’habitude : les multiplications ou divisions avant les additions et soustractions, elles-mêmes avant les décalages qui sont encore avant les opérations sur les bits. Par exemple, comme * précède +, une opération comme i+j*l doit être lue i+(j*l), c’est-à-dire que la multiplication est prioritaire et réalisée en premier. Le tableau de précédence complet des opérateurs est donné en annexe.

¤
Opérateur Description Exemples
+ Opérateur unaire sans effet. +i donne 3
+j
donne -12
- Opérateur unaire de changement de signe. Si x est une variable unsigned, on ajoute 216 ou 232 à -x pour conserver un signe positif. -i donne -3
-l
donne 100000
-u
donne 30536
-ul
donne 1294967296
~ Opérateur unaire inversant tous les bits (1 changé en 0, 0 en 1). L’effet obtenu est que ~x = -x-1 si x est une variable signée, ~x = M-x si x est non signé, où M désigne la plus grande valeur possible de x, soit 65 535 pour une variable à deux octets, et 4 294 967 295 pour une à quatre octets. ~i donne -4
~j
donne 11
~l donne 99999
~u
donne 30535
~ul donne 1294967695
* Opérateur binaire symétrique de multiplication. i*j donne -36
l*i
donne -300000
u*i donne 39464 (troncature)
/ Opérateur binaire de division sans reste. On obtient le quotient de la division euclidienne des deux opérandes, s’ils sont positifs ; sinon le résultat dépend de la machine et il est préférable de se méfier. Les résultats suivants sont obtenus avec Turbo C++ sur PC. l/i donne -33333
u/i
donne 11666
l/j donne 8333
(-l)/j
donne -8333
u/j donne 0 (ici j est transformé en unsigned de valeur 65 524)
% Opérateur binaire de division modulo. Renvoie le reste de la division euclidienne des opérandes s’ils sont positifs. On a toujours la relation x == (x/y)*y + (x%y). l%i donne -1
u%i donne 2
l%j donne 4
(-l)%j donne -4
u%j donne 35000 (idem)
+ Opérateur binaire symétrique d’addition. i+j donne -9
u+i
donne 35003
ul+l donne 2999900000
l+u
donne -65000
- Opérateur binaire de soustraction. i-j donne 15
u-i
donne 34997
ul-l donne 3000100000
l-ul donne 1294867296 (débordement)
<< Opérateur binaire de décalage des bits à gauche : x << y vaut x décalé de y bits à gauche ; les bits de poids fort sortants sont perdus, les entrants valent 0, si y est positif (si y est négatif, le résultat est indéfini). Cette opération donne donc x * 2y, avec troncature. i << 2 donne 12
l << i
donne -80000
u << 4 donne 35712 (troncature)
>> Opérateur binaire de décalage des bits à droite. Comme précédemment, mais les bits sont décalés vers la droite. L’opération x >> y est donc égale à x / 2y. i >> 2 donne 0
l >> i
donne -12500
u >> 4 donne 2187
& Opérateur binaire symétrique de « et » logique. Les bits des deux opérandes sont conjugués en « et » logique (multiplication logique). i&6 donne 2
i&j
donne 0
l&u donne 2080
^ Opérateur binaire symétrique de « ou exclusif » logique. Les bits des opérandes sont conjugués en « ou exclusif » logique (différence logique). i^6 donne 5
i^j
donne -9
l^u donne -69160
| Opérateur binaire symétrique de « ou » logique. Les bits des opérandes sont conjugués en « ou » logique (addition logique). i|6 donne 7
i|j
donne -9
l|u donne -67080

Ceci constitue une liste respectable d’opérateurs, mais en pratique, ce sont surtout les opérateurs arithmétiques +, -, *, /, % qui sont utilisés, les autres opérant au niveau des bits sont plutôt destinés à des opérations de masquage assez pointues, et rares.

Précédent Précédent Sommaire Sommaire Suivant Suivant