The typical upper bound for long is also 2,147,483,647.
You'd need to use long long to calculate that, but why bother? The exact value of that expression is 947800188, which fits nicely into a 32-bit integer.
Oh, sorry. I thought you were just trying to get it to work.
The problem is that the default type for integer literals is int. In your implementation, int seems to be a 32-bit signed integer. 16807*1622647863 gives 18CD B87E 16E1, but that doesn't fit in 32 bits, so it's truncated to B87E 16E1 (-1199696159). The value is negative due to two's complement (http://en.wikipedia.org/wiki/Two's_complement ).
The type of a literal can be changed be adding suffixes: 16807ULL * 1622647863ULL. "ULL" means "this literal is an unsigned long long".
Note that long long is not standard, but it's supported in most implementations.