1

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;

?
Perso j'ai un doute grin

2

c quoi ton doute parce que moi j'en n'ai pas
avatar
納 豆パワー!
I becamed a natto!!!1!one!

3

PpHd: je suis pas sur a 100% mais vu que c'est du C et pas de l'ASM, a priori oui
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

4

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;
?

Non, UINT_MAX n'est pas nécessairement un nombre de Mersenne (une puissance de 2 moins un), donc l'arithmétique par modulo (modulo UINT_MAX+1) garantie pour les unsigned ne maintient pas forcément le modulo par 32 intact.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

Je ne connais aucun systeme ou UINT_MAX est une puissance de 2. Puissance de 2, - 1, par contre smile
Peux-tu expliciter davantage ? Je n'ai pas tres bien compris.

6

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.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

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.

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...

(enfin c'est vrai que ça relève du bon sens mais bon...)

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" roll)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

8

vince
:
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.
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...

Tu sais lire? Je répète: 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. Montre-moi une puissance de 2 supérieure ou égale à 65536 (65535+1) qui n'est pas divisible par 32. grin
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" roll)

Si on fait ça dans un compilateur C, c'est en violation du standard C. ISO/IEC 9899:1999 (E) paragraphe 5.2.4.2.1 [#2]. CHAR_MIN est soit 0 (si le compilateur se comporte comme -funsigned-char), soit <=-127 (si le compilateur se comporte comme -fsigned-char).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Merci beaucoup, Kevin. C'est parfait.
Je vais donc faire:

if (UINT_MAX%32 == 1)
j = (-i)%32;
else
{
j = i%32;
if (j)
j = 32-j;
}

10

PpHd
: if (UINT_MAX%32 == 1)

plutôt ==31... smile

Et vive les tests pointilleux. grin C'est du scolaire/universitaire? Parce qu'à part dans ce contexte-là, même moi, je ne suis pas aussi pointilleux que ça. smile ld-tigcc te jette carrément un #error s'il ne trouve pas de types de 8, 16 et 32 bits exactement. grin
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

il n'est plus etudiant :]
avatar
納 豆パワー!
I becamed a natto!!!1!one!

12

En fait c'est encore pire grin C'est du code pour la FSF. Et la ils sont penibles question portabilite wink

if (UINT_MAX%32 == 31 && (-(unsigned)1) %32 > 0)
j = (-i)%32;
else
{
j = i%32;
if (j)
j = 32-j;
}

13

PpHd :
En fait c'est encore pire grin C'est du code pour la FSF. Et la ils sont penibles question portabilite wink

LOL, en effet. grin Remarque, avec les 10000 plateformes sur lesquelles doit tourner leur code, ce n'est pas si étonnant que ça. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

14

Mais qu'est-ce que vous racontez ? confus

Extrait d'un draft C99 datant du 18/01/99 (si tu as la version définitive Kevin, tu peux regarder, mais je doute fortement que ça ait changé gni) :
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.


Donc les calculs sont faits modulo une puissance de 2 embarrassed

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

15

OK, bon, dans ce cas, je retire ce que j'ai dit plus haut. grin
Reste à savoir si le standard C90 et surtout les compilateurs K&R se comportaient de la même manière.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

16

Et il faut dire qu'ils sont lourds. Ce n'est pas pratique pour les ordinateurs ternaires, cette restriction. grin
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

J'ai pas le standard C89 ou C90 sous la main, mais tu peux toujours chercher si ça t'amuse tongue Cela dit, ça m'étonnerait qu'ils aient pris la décision de réduire la portabilité du langage.

Et puis le K&R, c'est un standard? trifus

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

18

Et il faut dire qu'ils sont lourds. Ce n'est pas pratique pour les ordinateurs ternaires, cette restriction. grin

Bah oui, donc (comme je l'ai déjà dit gni) il faut pas utiliser les "unsigned" tout le temps, mais seulement quand on en a vraiment besoin tongue

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

19

Le c99...
LOL question portabilite, chez la FSF, il faut que ca fonctionne pour le C K&R grin

20

Bah matte le standard K&R, c'est probablement pareil.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)