This question only comes up if multiplications and divisions are to be "optimised" by shifts. Since decades, this is done by the compiler, and never performance relevant; just obfuscates the program.
So if a number shall be divided by 8, the proper type should be used and the division written. If a certain number of bits has to be moved right, use an unsigned integer; the high order bits are irrelevant in this case.