开发者

Dividing integers

I know when dividing integers the default way it works is to discard the fractional part. E.g.,

int i, n开发者_如何学Go, calls = 0;
n = 1;
n /= 3;
printf("N = %i\n", n);
for (i = 1; i > 0; i /= 3) {
    calls++;
}
printf("Calls = %i\n", calls);

The code above prints:

N = 0
Calls = 1

Could you please explain this behavior?


1 divided by 3 = .3333 (repeating of course), mathematically. You can think of the computer as truncating the .3333 since it is doing integer arithmetic (0 remainder 1).

The for loop executes because i = 1 and 1 > 0. After executing the body of the loop, you divide i by three and i becomes 0, which is not greater than 0.


rewrite as while and it becomes apparent.

i = 1;
while ( i > 0 )
{
    calls++;        
    i /= 3; //This becomes .3333, which truncates to zero
}


Because it executes the loop once.

The loop increment in for is executed after the loop body, and at loop entry i > 0 is true as 1 > 0, on the next loop division occurs and then the test become false and loop exit.


Where's the problem? The first line of output is immediate: 1/3=0.33333..., removing the fractional part it's 0.

For the second line keep in mind that the for cycle is translated to something like this:

i=1;
while(i>0)
{
    calls++;
    i/=3;
}

So, at start i is 1; the first iteration of the while is executed because i, being 1, is greater than 0. calls is 0 and is incremented by 1, thus gets to 1. i is divided by 3, so it gets to 0 (because the fractional part is not computed in integer division). The while condition check is performed again, but now i is 0, thus the cycle is not repeated. calls remains to 1 and this value is printed on the screen.


n is an int, a division will return an integer and no double or float


Because in integer arithmetic, the answer to 1 divided by 3 is 0 with a remainder of 1. If you divide two integers, you get integer arithmetic. If you want floating point arithmetic, you need at least one of the operands to be a floating point value.


It's all very simple.

int i, n, calls = 0; // Set calls to 0
n = 1;               // n is now 1
n /= 3;              // n /= 3 = 1/3 = 0
printf("N = %i\n", n);
for (i = 1; i > 0; i /= 3) { // 1/3 = 0
    calls++;                 // runs once
}                            
printf("Calls = %i\n", calls);

Hope this helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜