问题描述:

I understand how binary works and I can calculate binary to decimal, but I'm lost around signed numbers.

I have found a calculator that does the conversion. But I'm not sure how to find the maximum and the minumum number or convert if a binary number is not given, and question in StackO seems to be about converting specific numbers or doesn't include signed numbers to a specific bit.

The specific question is:

`We have only 5 bits for representing signed numbers in two's complement:`

What is the highest signed integer?

Write its decimal value (including the sign only if negative).

What is the lowest signed integer?

Write its decimal value (including the sign only if negative).

Seems like I'll have to go heavier on binary concepts, I just have 2 months in programming and I thought i knew about binary conversion.

From a logical point of view:

**Bounds in signed representation**

You have 5 bits, so there are 32 different combinations. It means that you can make 32 different numbers with 5 bits. On unsigned integers, it makes sense to store integers from 0 to 31 (inclusive) on 5 bits.

However, this is about unsigned integers. Meaning: we have to find a way to represent negative numbers too. Meaning: we have to store the number's value, but also its sign (+ or -). The representation used is 2's complement, and it is the one that's learned everywhere (maybe other exist but I don't know them). In this representation, the sign is given by the first bit. That is, in 2's complement representation a positive number starts with a 0 and a negative number starts with an 1.

And here the problem rises: Is 0 a positive number or a negative number ? It can't be both, because it would mean that 0 can be represented in two manners for a given number a bits (for 5: 00000 and 10000), that is we lose the space to put one more number. I have no idea how they decided, but fact is 0 is a positive number. For any number of bits, signed or unsigned, a 0 is represented with only 0.

Great. This gives us the answer to the first question: what is the upper bound for a decimal number represented in 2's complement ? We know that the first bit is for the sign, so all of the numbers we can represent must be composed of 4 bits. We can have 16 different values of 4-bits strings, and 0 is one of them, so the upper bound is 15.

Now, for the negative numbers, this becomes easy. We have already filled 16 values out of the 32 we can make on 5 bits. 16 left. We also know that 0 has already been represented, so we don't need to include it. Then we start at the number right before 0: -1. As we have 16 numbers to represent, starting from -1, the lowest signed integer we can represent on 5 bits is -16.

More generally, with `n`

bits we can represent `2^n`

numbers. With signed integers, half of them are positive, and half of them are negative. That is, we have `2^(n-1)`

positive numbers and `2^(n-1)`

negative numbers. As we know 0 is considered as positive, the greatest signed integer we can represent on `n`

bits is `2^(n-1) - 1`

and the lowest is `-2^(n-1)`

**2's complement representation**

Now that we know which numbers can be represented on 5 bits, the question is to know how we represent them.

We already saw the sign is represented on the first bit, and that 0 is considered as positive. For positive numbers, it works the same way as it does for unsigned integers: 00000 is 0, 00001 is 1, 00010 is 2, etc until 01111 which is 15. This is where we stop for positive signed integers because we have occupied all the 16 values we had.

For negative signed integers, this is different. If we keep the same representation (10001 is -1, 10010 is -2, ...) then we end up with 11111 being -15 and 10000 not being attributed. We could decide to say it's -16 but we would have to check for this particular case each time we work with negative integers. Plus, this messes up all of the binary operations. We could also decide that 10000 is -1, 10001 is -2, 10010 is -3 etc. But it also messes up all of the binary operations.

2's complement works the following way. Let's say you have the signed integer 10011, you want to know what decimal is is.

- Flip all the bits: 10011 --> 01100
- Add 1: 01100 --> 01101
- Read it as an unsigned integer: 01101 = 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 13.

10011 represents -13. This representation is very handy because it works both ways. How to represent -7 as a binary signed integer ? Start with the binary representation of 7 which is 00111.

- Flip all the bits: 00111 --> 11000
- Add 1: 11000 --> 11001

And that's it ! On 5 bits, -7 is represented by 11001.

I won't cover it, but another great advantage with 2's complement is that the addition works the same way. That is, When adding two binary numbers you do not have to care if they are signed or unsigned, this is the same algorithm behind.

With this, you should be able to answer the questions, but more importantly to understand the answers.

This topic is great for understanding 2's complement: Why is two's complement used to represent negative numbers?