In reply to Yasmine4:
It’s because we use binary way more than our friends in high-level software. As far as finding the ranges, if a data type contains n bits then its range is
[0, (2 ^ n) - 1] // unsigned
[-(2 ^ (n - 1)), (2 ^ (n - 1)) - 1] // signed two's complement