For a binary sequence of X bits there are 2^x possible values.
Using unsigned integers to represent these then, you have the set from 0, 1, ...(2^x)-1. If one wanted to effectively shift the values down to have half negative and half positive, you would subtract 2^(x-1) (which is half the range) from every value, this giving you 0 - 2^(x-1),....,(2^x)-1 - (2^(x-1)).
Reorganizing the later term into 2^x- 2^(x-1) - 1 and recognizing, that y^x - y^(x-1) = y^(x-1), you then have your range, -(2^(x-1))...2^(x-1)-1.
This is done in implementation by negating the MSB, which by virtue of it's place value is half the range.