I came across an article which mentioned that the result of !0 is compiler dependent. The result can be either 1 or FF or FFFF and so on.
As for C99 standard 6.5.3.3 Unary arithmetic operators,
The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).
Is it really compiler dependent?
You seem to have answered you own question already, quoting from the standard where it specifies that the result must be 0 or 1.
As such, about all I can guess is that you're asking whether all C compilers conform with the standard in this respect. Since I haven't used every C compiler ever written, I can't really answer that definitively. I've never used or heard of one that produced any other value though -- and given the years I've spent hanging out here, on Usenet, etc., it seems likely that if such a beast existed I'd probably have heard of it.
Edit: It's probably worth noting that even in K&R1, it's specifically described as producing 0 or 1 (§A.7.2):