Bits have no built-in meaning. The 8-bit pattern 11111111 is 255 read as unsigned and −1 read as twos complement. Which is right depends only on what the program intends.
What stays the same:
- patterns with MSB 0 mean the same value in both readings
- addition and subtraction produce identical bits for both, so one adder serves both
What differs:
- patterns with MSB 1: the signed value is the unsigned value minus 2ⁿ
- the range: 0 to 2ⁿ − 1, versus −2ⁿ⁻¹ to 2ⁿ⁻¹ − 1
- the overflow test: the carry out for unsigned, the sign rule (V) for signed
- comparisons:
1000>0111unsigned (8 > 7), but1000<0111signed (−8 < 7) - widening: zeros for unsigned, sign extension for signed
That's why processors keep both a carry flag and an overflow flag, and why languages like C have both int8_t and uint8_t. The hardware computes the bits once; the program decides which reading to trust.