unsigned i;
int j;
j = (-i)%32;
Est-ce toujours equivalent (quelque soit le systeme, la representation des nombres signes -complement a 2, bit di signe + val abs, complement a 1) a :
j = i%32;
if (j)
j = 32-j;
?
Perso j'ai un doute

PpHd :
J'ai :
unsigned i;
int j;
j = (-i)%32;
Est-ce toujours equivalent (quelque soit le systeme, la representation des nombres signes -complement a 2, bit di signe + val abs, complement a 1) a :
j = i%32;
if (j)
j = 32-j;
?
Kevin Kofler :
L'expression C -i sur un unsigned est définie comme correspondant à l'expression mathématique (UINT_MAX+1)-i. Si (UINT_MAX+1)%32 n'est pas nul, c'est-à-dire si 32 ne divise pas (UINT_MAX+1), alors ton résultat ne sera pas bon. Mais si (UINT_MAX+1) est une puissance de 2, c'est forcément divisible par 32 parce que le standard C spécifie un UINT_MAX de 65535 minimum.
vince
:Kevin Kofler :saufa dans le cas tordu où ton uint max est codé sur 4 bits(ou moins) 16 est une puissance de deux mais non divisible par 32...
L'expression C -i sur un unsigned est définie comme correspondant à l'expression mathématique (UINT_MAX+1)-i. Si (UINT_MAX+1)%32 n'est pas nul, c'est-à-dire si 32 ne divise pas (UINT_MAX+1), alors ton résultat ne sera pas bon. Mais si (UINT_MAX+1) est une puissance de 2, c'est forcément divisible par 32 parce que le standard C spécifie un UINT_MAX de 65535 minimum.
pour l'histoire du nombre de mersènne, j'ai déjà eu à bosser sur une appli ou les char étaient définis de 1 à 256 (au lieu du 0à 255 habituel) parcqu'on avait pas besoin du zéro (dans la logique de l'appli, valeur interdite) et qu'on avait des (rares) cas où 256 valeurs étaient nécessaires... donc ils avaient modifié le type (prétextant que c'était plus simple d'avoir un type tordu plutôt que de fonctionner avec un type standard et faire "+1")
PpHd
: if (UINT_MAX%32 == 1)
PpHd :
En fait c'est encore pireC'est du code pour la FSF. Et la ils sont penibles question portabilite
6.2.6.2 Integer types
1 For unsigned integer types other than unsigned char, the bits of the object
representation shall be divided into two groups: value bits and padding bits (there need
not be any of the latter). If there are N value bits, each bit shall represent a different
power of 2 between 1 and 2^N-1, so that objects of that type shall be capable of
representing values from 0 to 2^N - 1 using a pure binary representation; this shall be known as the value representation. The values of any padding bits are unspecified.
Et il faut dire qu'ils sont lourds. Ce n'est pas pratique pour les ordinateurs ternaires, cette restriction.