Valeur negative qui sort des tenebres ?
En testant un bout de code je remarque qu'une valeur negative s'integre dans la variable S alors que C n'est JAMAIS negatif. Comment peut on obtenir des valeurs negatives de nulle part encore un mystere de l'informatique ... Toutefois si quelqu'un voit d'ou ca peut venir ....
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| double SimulationMux(double L)
{
int k,T=8620,A,m=20,S,C;
double MD;
//printf("foo 2");
//C stand for buffer occupancy
//S= sum of the queue size
int N=m*T;//simulation for an integer number of periods, i.e., mT time slots
//for timeslot = 1 to infinity,there is 8620 timeslots every 5,875ms(packetization delay)
for(k=0;k<N;k++)
{
if(k==0) { C=0;}
// printf("kboucle1=%d ",k);
//figure out how many of the sources generate an arrival NOW
//this is the number of arriving cells - use the equation of evolution
//to figure out the new buffer occupancy
A=ArrivalFromSources(k,L);
//printf("number of arrival = %d \n",A);
C=BufferOccupancy(A,C);
//printf("buffer occupancy = %d \n",C);
//sum of the queue size :
if(C<0) printf("C est negatif %d\n",C);
S+=C;
//printf(" S=%d\n",S);
}
// if(S<0){S=-S;}
//printf(" S=%d\n",S);
//mean delay
MD=Delay(S,N)+5.875;
//printf("%lf",MD);
return MD;
}
int BufferOccupancy(int A,int C)
{
int Cf;
Cf=C+A-1;
if(Cf<0) Cf=0;
//printf("A=%d\n",A);
return Cf;
} |
A noter que la fonction Bufferoccupancy retourne TOUJOURS une valeur positif ou nul... incomprehensible je vous le dis ...
Re: Valeur negative qui sort des tenebres ?
Citation:
Envoyé par Battosaiii
En testant un bout de code je remarque qu'une valeur negative s'integre dans la variable S alors que C n'est JAMAIS negatif. Comment peut on obtenir des valeurs negatives de nulle part encore un mystere de l'informatique ... Toutefois si quelqu'un voit d'ou ca peut venir
Il n'y a aucun mystère. Il faut savoir que le langage C supporte 3 modes de représentation des nombres négatifs
- signe + magnitude
- complément à 1
- complément à 2
Détails ici :
http://mdbui2.ift.ulaval.ca/Knowledges/Coding_Number/Nombres_negatifs.htm
Dans le cas du complément à 2 (le plus courant) lorsqu'on atteint la limite supérieure (INT_MAX, dans le cas d'un int, par exemple), la valeur suivante correspond à la représentation d'un nombre négatif (en l'occurence, INT_MIN).
Supposons que INT_MAX vaille 0x7FFF (32767). Si on fait +1, on obtient 0x8000 qui est la représentation de -32768 dans un mot de 16-bit.
Si tu ne veux pas de valeurs négatives, il faut utiliser des entiers non signés (unsigned).