You're just repeating words, without any understanding. There's no
such thing as "negative zero" (or negative anything) in the context of
bitwise operations.
It is AFAIK implementation-defined whether the concept of "negative
zero" is meaningful in standard C (depending on the representation
of signed integers).
How can a bitwise operation trap? It can't.
Of course it can! (Why wouldn't it? And do modern digital computers
perform any operations that *aren't* bitwise, anyway?)
To clarify pete's point:
(uchar)-1 == (uchar)-((int)1) == (-(int)1)+UCHAR_MAX == UCHAR_MAX-1
....which is guaranteed to have an all-ones bit pattern, regardless
of padding or n's-complement.
Hello? The point is that -1 is ***being used as*** a bit pattern.
Then it's being used incorrectly. -1 is *not* a bit pattern, it's
an integer expression equal to the additive inverse of the integer 1.
It doesn't have a "bit pattern" per se.
The intent is to get "all 1s", which is true if the integer
representation is 2's complement; that's an implicit assumption
of the code.
If that *were* an implicit assumption of the code, then the code
would be broken. But it's not. Pete's code AFAICT doesn't assume
anything earth-shattering about the integer representations used
by the target system.
(This is the best reason not to use -1: the intent is not
perfectly clear).
However, it *does* produce the right answer, which is a point in
its favor. ~0 might trap, and in any case I think (unsigned char)-1
has a bit more aesthetic value to it (YMMV, of course).
And if you want everything to be *perfectly* clear, then you might
want to consider a different programming language. C is just
full of 'for (i=0; a
; ++i)'s and 'while (*s++ = *t++)'s; if
a simple -1 throws you, then you're in trouble. 
-Arthur