Jump to content

Recommended Posts



I found one problem in my program.




unsigned int a;

unsigned int b;

signed int c;


c = (((b-a)*100)/:D; // Equation 1


c = (b-a);

c = (c*100);

c = (c/B); //Equation 2





In Equation 1 & 2 Logically same.

But during debug i found both ans differ from each other.

If i put a = 80 & b = 9 then c is:

Ans. of Equation 1 is 0x195c

Ans. of Equation 2 is 0xfcec


I use Boostc 6.11 .


Why ?







Link to post
Share on other sites

c = (((b-a)*100)/b); // Equation 1

c = (b-a);
c = (c*100);
c = (c/b); //Equation 2


[assuming a and b are decimal]


Lets take Equation 2:


c (which can be negative) = (b-a) = (9 - 80) = -71 (i will do the 2s compelment at the end)

c = (c * 100) = -71 * 100 = -7100

c = (c / 9) = -7100 / 9 = -788.9 = 0xFCEC


But with EQ 1 (b-a) will be somming like 0xFFB9 as it cannot go negative, hence there is an error (a unsigned int - unsigned int = unsigned int to the compiler)

Link to post
Share on other sites



c = (((b-a)*100)/b); // Equation 1

c = (b-a);
c = (c*100);
c = (c/b); //Equation 2


I think you will find that in equation 1 all the stuff on the right hand side is performed at the precision of the variables on the right hand side; ie a and b, so unsigned int. When the calculations are finished the result is converted to a signed int and assigned to c.


In the second calculation the subtration is correctly converted to a signed int in the first statement. Then the second and third statements are performed at a signed int level instead of an unsigned int.


I think?? this is C standard behaviour.

I also think that if you want to change it, you can just cast it to an signed int eirlier.

(NB: I haven't tried on this compiler)


c = ((((signed int)(b-a))*100)/b);


or use;


signed int d;
signed int e;

d = a;
e = b;

c = (((e-d)*100)/e);


or step it through as in your second example.



c = (b-a);
c *= 100;
c /= b;


perhaps it might also work like:


c = (b-a);
c = (c*100)/b;


As there is a signed int on the right, but I would have to read my C books again (and the compiler docs) to check that one.



Hope that helps.


Darren J

Edited by DarrenJ
Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...