Jump to content

# What Happen?

## Recommended Posts

Hi,

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 ?

Regards

Tectona ##### 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)

##### Share on other sites

tectona

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

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

Loading...
×
×

• #### Activity

• Leaderboard
×
• Create New...