If you must assume, document and localize. Code that takes advantage of the two's complement representation of numbers on most machines should not be used. Optimizations that replace arithmetic operations with equivalent shifting operations are particularly suspect. You should weigh the time savings with the potential for obscure and difficult bugs when your code is moved. Unsigned types other than unsigned int are highly compiler-dependent.
Data alignment is also important.
Thus, a particular structure may have its elements at different offsets on different machines, even when given elements are the same size on all machines. Alignment considerations and loader peculiarities make it very rash to assume that two consecutively-declared variables are together in memory, or that a variable of one type is aligned appropriately to be used as another type. Hence any code that depends on the left-right orientation of bits in an object deserves special scrutiny. Bit fields within structure members will only be portable so long as two separate fields are never concatenated and treated as a unit. Actually, it is nonportable to concatenate any two variables.