Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

integer overflow

17 réponses
Avatar
Taurre
Bonjour =E0 tous,

J'ai une question au sujet de l'arithm=E9tique enti=E8re.
Je sais que lorsque l'on d=E9passe la capacit=E9 d'un int, comme ceci par
exemple:


int n =3D INT_MAX + 1;


il s'agit d'un comportement ind=E9termin=E9 et on ne peut donc pas =EAtre
certains d'obtenir INT_MIN comme valeur. La m=EAme r=E9flexion vaudrait
pour un unsigned int.

Cependant, j'aimerais savoir ce qu'il en est pour les types entier
d'une taille inf=E9rieur =E0 celle d'un int. Par exemple, si j'utilise un
champ de bits non sign=E9 de trois bits. Est-ce que je suis garantit
que, si ce dernier vaut 7 et que je l'incr=E9mente, j'obtienne 0 ou
s'agit-il d'un comportement ind=E9termin=E9?

Merci d'avance pour vos r=E9ponses.

7 réponses

1 2
Avatar
Taurre
Merci infiniment pour vos réponses.
Donc si je résume bien, les entiers non signés ont un comportement
déterminé si on dépasse la valeur maximale de leur intervalle sauf
s'il s'agit d'un champ de bits?
Avatar
Lucas Levrel
Le 21 juillet 2011, Tonton Th a écrit :

On 07/21/2011 03:30 PM, Antoine Leca wrote:

for (foo=0; foo<10; foo++) {



L'opération arithmétique d'incrémentation s'écrit

foo + 1



Boucle cosmétique, l'essentiel est entre les deux printf,
et répond à la question traitée. Maintenant, il y a peut
être 20 ans que ça marche par miracle ;)



En fait, Antoine n'a pas laissé la bonne ligne, mais sa remarque reste
valable. Dans :
bf.field++;


il y a deux opérations :
bf.field¿.field+1;
l'addition 7+1, qui donne 8, et l'affectation de 8 à bf.field, qui donne
0.

--
LL
Avatar
espie
In article ,
Taurre wrote:
Merci infiniment pour vos réponses.
Donc si je résume bien, les entiers non signés ont un comportement
déterminé si on dépasse la valeur maximale de leur intervalle sauf
s'il s'agit d'un champ de bits?



Oui. Plus precisement, les champs de bits ont regulierement des petits
soucis d'implementation qui font qu'il vaut mieux ne pas trop compter sur
leur semantique precise...

alors que pour les entiers non signes, c'est etudie pour !
Avatar
Tonton Th
On 07/22/2011 11:09 AM, Lucas Levrel wrote:

L'opération arithmétique d'incrémentation s'écrit

foo + 1



Boucle cosmétique, l'essentiel est entre les deux printf,
et répond à la question traitée. Maintenant, il y a peut
être 20 ans que ça marche par miracle ;)



En fait, Antoine n'a pas laissé la bonne ligne, mais sa remarque reste
valable. Dans :
bf.field++;


il y a deux opérations :
bf.field¿.field+1;
l'addition 7+1, qui donne 8, et l'affectation de 8 à bf.field, qui donne 0.



Mais dans ce cas-là, pour moi, ce n'est plus une incrémentation,
mais une addition. bf.field++ est différent de bar¿.field+1
puisque on sort du contexte du bitfield, et qu'il y a donc une
promotion, non ?


--

Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
Avatar
Antoine Leca
Tonton Th écrivit :
Mais dans ce cas-là, pour moi, ce n'est plus une incrémentation,
mais une addition.



Ah! maintenant je comprend, tu parlais d'un autre langage C, le tien.

Dans la norme du langage, il est écrit (6.3.6 Additive operators)
[#2:] [...] (Incrementing is equivalent to adding 1.)

Ou un peu avant (6.3.2.4 Postfix increment and decrement operators)
[#2:] [...] After the result is obtained, the value of the
operand is incremented. (That is, the value 1 of the
appropriate type is added to it.) See the discussions of
additive operators and compound assignment for [...]

Désolé pour la confusion, je n'avais pas compris.


bf.field++ est différent de bar¿.field+1
puisque on sort du contexte du bitfield, et qu'il y a donc une
promotion, non ?



Non (enfin, pour moi, et dans le cadre de la machine abstraite).
Il y a promotion pour le champ de bit, exactement comme il y a promotion
pour un type entier d'ordre inférieur à int (en utilisant les notions de
C99).

Évidemment, un compilateur est en droit d'optimiser cela à son goût ;
par exemple pour un champ de taille 1, en utilisant XOR.


Antoine
Avatar
Antoine Leca
Taurre écrivit :
Merci infiniment pour vos réponses.
Donc si je résume bien, les entiers non signés ont un comportement
déterminé si on dépasse la valeur maximale de leur intervalle sauf
s'il s'agit d'un champ de bits?



Je n'écrirais pas cela. Mais la remarque de Marc est plus juste que
d'éventuelles précisions sur ce que devrait faire les compilateurs : si
tu cherches à écrire des programmes portables tout en privilégiant la
compacité, il vaut mieux éviter les champs de bits et écrire le code
équivalent avec des opérations binaires (&, |, ^) et des masques.


Antoine
Avatar
Taurre
D'accord, merci à tous pour vos réponse :)
1 2