When I first read about two’s complement, I used to wonder why such scheme is really necessary since we can just use the first bit as a sign bit. For example when 2 can be represented as 0010, we can just flip the sign bit and represent -2 as 1010
The approach above is intuitive but becomes problematic when need to do addition operations
For example, let’s say we need to ad -1 and 2
Using the intuitive approach, -1 -> 1001 and 2 -> 0010 and therefore, -1 + 2 = 1001 + 0010 = 1011 = -3 which is not correct
Using two’s complement, -1 -> 1111 and 2-> 0010 and therefore -1 + 2 = 1111 + 0010 = 10001 and we need to discard the carry -> 0001 = 1
Also, when using the intuitive method, 0000 and 1000 both represent zero
Also, the intuitive method is inconvenient when it comes to comparing numbers. -7 (0111) is smaller than -6 (0110) but, 0111 is actually larger than 0110
Why INT_MIN is -INT_MAX - 1
INT_MAX is 0X7FFFFFFF and when we flip the bits, we get 0X80000000
Then we need to add 1 to the above which makes it 0X80000001
Since we need to add 1 in the end, we can never have 0X80000000 after step 2 and therefore we can use it as INT_MIN