Section 04 Part 02 – Signed and Unsigned “A positive attitude may not solve all your problems, but it will annoy enough people to make it worth the effort.” ~Herm Albright, quoted in Reader's Digest, June 1995

Introduction

In mathematics, you can have negative numbers (-1, -2, -3, etc).  This section looks at signed and unsigned, and how they can be used in programming to “fake” (or rather pretend) that negative numbers exist.

Unsigned

Right now, you’ll most probably agree with me, that for a byte of data; 00 is the lowest number, and FF Is the highest number.  For a word of data; 0000 is the lowest number, and FFFF is the highest number.  And for a long-word of data; 00000000 is the lowest number, and FFFFFFFF is the highest number.

I hope we’re cool with that so far...

Now, this is what we refer to as “unsigned”.  Unsigned numbers are always positive from 00, right up to FF.

Signed

There will be times however, where you’ll need negative numbers to get some sort of calculation done.  This is where “signed” comes in.

When a byte of data is treated as signed; 00 to 7F is treated as positive, while 80 to FF is treated as negative:

 Unsigned Lowest number Highest number 00 01 02 03 04 05 06 07 ... ... F8 F9 FA FB FC FD FE FF Signed Lowest number Highest number 80 81 82 83 ... ... FC FD FE FF 00 01 02 03 04 ... ... 7C 7D 7E 7F

As you can see for “signed” the numbers 80 to FF are red for negative:

 ... 03 = +3 02 = +2 01 = +1 00 = 0 FF = -1 FE = -2 FD = -3 ...

This is a process known as "Two's Complement", it is the idea of using the MSB (most significant bit) to signify the value is negative:

 80 = 1000 0000

All numbers from 80 to FF will have that bit 1 (set), while the positive numbers from 00 to 7F will have it 0 (clear).

For word and long-word, the same applies:

 8000 = 1000 0000 0000 0000

 80000000 = 1000 0000 0000 0000 0000 0000 0000 0000

It’s important not to confuse byte, word and long-word at this stage, for good reasons.

The byte FC is -4, but if you were to read FC as a word; 00FC, then the number is no longer negative, it is read as positive for word because it is between 0000 and 7FFF.  To have it as -4 for word, you need to extend it as FFFC.  The same goes for long-word, the number needs to be extended.  FFFFFFFC is -4 for long-word.

Conversion

It should be made very clear however, that simply changing the MSB will not convert the polarity of a number from positive to negative, or negative to positive directly.  For example, the number 04 in binary 0000 0100.  Setting the MSB will give us 1000 0100 in hex 84, while 84 is a negative number, it is not -4, it is in fact -7C.

Negative numbers start from FF (which is -1), and proceed downwards, FE (-2), FD (-3), FC (-4), and so on...

There is of course a simpler method to convert a number from positive to negative (or negative to positive), which can be done by performing a "logical compliment" onto the number (you may remember the "NOT" instruction), and then adding 1 to the number afterwards, for example, the positive number 04 (0000 0100), perform "logical compliment" by swapping the bits:

 0000 0100             |||| ||||           VVVV VVVV             1111 1011

This gives us FB (1111 1011), then adding 1 to it will give us FC (-4), and that is the correct conversion, it also works for converting negative numbers into positive.  It is a strong belief that the CPU does this internally for the "NEG" instruction (which will be explained shortly in the next part).

Further info

Your next question may probably be “how do I treat a number as unsigned or signed?”.  It’s a good question, the answer is simple, but not easy to explain, so bear with me please.

The 68k has what is known as a “Conditional Code Register” (CCR), and every time an instruction is processed, information is saved to the CCR, this information can include:

• Whether or not the result is 00 (Z flag).
• Whether the result is positive or negative (N flag).  For signed
• Whether the result has gone above 7F to 80 (V flag).  For signed
• Whether the result has gone above FF to 00 (C/X flag).  For unsigned

As you can see, information for both signed and unsigned are stored away in the CCR.  So to sum it up, the number is treated as both signed and unsigned in most cases.

There are instructions that we’ll get to later on, that will read the CCR and perform an action depending on the signed or unsigned results.  So you’ll have complete control over how the number is treated.

Important: The above information about the CCR is very minor; more information on the CCR will be explained later on in time.  It is explained here briefly so you can understand when a number is treated as signed or unsigned, and nothing more.  So don’t worry if you don’t quite understand the CCR just now, you’re not expected to.