13

Two's complements is set to make it easier for computer to compute the substraction of two numbers. But how computer distinguish an integer is signed integer or unsigned integer? It's just 0 and 1 in its memory.

For exmaple, 1111 1111 in the computer memory may represent number 255 but also can represent -1.

viperchaos
  • 345
  • 1
  • 4
  • 15

2 Answers2

17

Signed and unsigned use the same data, but different instructions.

The computer stores signed and unsigned integers as the same data. I.e. 255 and -1 are the same bits. However, you tell the compiler what type the variable has. If it is signed, the compiler uses signed operators for manipulating the variables (e.g. IDIV) and when unsigned, it uses another instruction (e.g. DIV). So the compiler makes a program which tells the CPU how to interpret the data.

Sjoerd
  • 71,634
  • 16
  • 123
  • 171
  • 2
    It's worth noting that on most CPUs the instruction is different only in the case of multiplication (MUL/IMUL for IA32) and division (DIV/IDIV) ([instruction reference](http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html)). The nifty thing about 2's complement isn't really that it's easier to subtract, but that addition (ADD) doesn't care if the numbers are signed or unsigned. Because of this, subtraction is indeed easier, since to subtract one can easily calculate the 2's complement of the subtrahend and add it to the minuend. – Phil Frost Jan 01 '13 at 19:44
6

It does not distinguish them. But with the complement, the computation is the same :

Below, d will be appended to decimal numbers, and b to binary numbers. Computations will be on 8 bits integers.

-1d + 1d = 1111 1111b + 1b = 1 0000 0000b

But since we overflowed (yep, that's 8 0s and a 1 on a 8 bits integers), the result is equal to 0.

-2d + 1d = 1111 1110b + 1b = 1111 1111b = -1d

-1d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

-1d + -1d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = -2d

And if you consider these operations on unsigned (binary values will be unchanged) :

255d + 1d = 1111 1111b + 1b = 1 0000 0000b (this overflows) = 0d

254d + 1d = 1111 1110b + 1b = 1111 1111b = 255d

255d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

255d + 255d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = 2d

Unsigned versus signed is thus just a visual representation of unsigned, only used when displaying to a human :-)

Scharron
  • 16,483
  • 6
  • 41
  • 63