1's complement and 2's complement

S

sarathy

Hi all,
I have a few doubts in the 1's and 2's complement
representation. Generally negative numbers can be represented using
either 1's complement or 2's complement representation.

1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

2's complement of 2 ( 0000 0010 ) is -2 ( 1111 1110 )
Adding we get , 0000 0010 + 1111 1110 = 0000 0000 ==> [ OK]

Does this complement representation have anything to do with the C's ~
[1's complement] operator ?
Is this representation architecture dependent or compiler dependent ?

Please clarify,

Regards,
Sarathy
 
S

SM Ryan

# Hi all,
# I have a few doubts in the 1's and 2's complement
# representation. Generally negative numbers can be represented using
# either 1's complement or 2's complement representation.
#
# 1's complement ---> reverse all the bits
# 2's complement ---> reverse all the bits + 1
#
# i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
# But when a number and its complement are added the result must be a
# zero right ??
# But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]

On a ones complement machine, ~0 is 0, called a negative zero.
Some CPUs convert -0 to +0, some don't. -0 = +0, but also
sometimes -0 < +0.

# Does this complement representation have anything to do with the C's ~
# [1's complement] operator ?

On ones complement CPUs, -x = ~x. Whether this was signficant when C
was first created, you would have to ask Ritchie.
 
R

red floyd

sarathy said:
Hi all,
I have a few doubts in the 1's and 2's complement
representation. Generally negative numbers can be represented using
either 1's complement or 2's complement representation.

1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

In a pure 1's complement notation, you have the concept of "minus zero",
which is the ones complement of 0.

So your result is "minus zero".
 
R

Roy Smith

"sarathy said:
Hi all,
I have a few doubts in the 1's and 2's complement
representation. Generally negative numbers can be represented using
either 1's complement or 2's complement representation.

1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

You did. In 1's complement, there is no unique representation for zero.
All 0's and all 1's are both equal to zero.
Does this complement representation have anything to do with the C's ~
[1's complement] operator ?

Not really
Is this representation architecture dependent or compiler dependent ?

Whether you are doing 1's complement or 2's complement math depends on the
underlying hardware. That being said, I haven't seen a 1's complement
machine in a couple of eons. It's pretty much an obsolete concept as far
as hardware design goes.
 
B

Bill Pursell

Roy said:
1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

You did. In 1's complement, there is no unique representation for zero.
All 0's and all 1's are both equal to zero.

No, in 8-bit ones complement, zero is represented as either
0x00 or 0x80. 0xff is -127.

The problem is that addition with one's complement is
not the same as addition with 2's complement. To
add two numbers, you have to perform different operations
depending on the signedness of the numbers, and that
is why 2's complement is preferred.
 
M

Michael Mair

Bill said:
Roy said:
1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

You did. In 1's complement, there is no unique representation for zero.
All 0's and all 1's are both equal to zero.

No, in 8-bit ones complement, zero is represented as either
0x00 or 0x80. 0xff is -127.

8-bit ones complement? You mean sign and magnitude.

There is only one kind of ones complement for C.

C99, 62.6.2#2: "
— the corresponding value with sign bit 0 is negated (sign and magnitude);
— the sign bit has the value -(2N) (two’s complement);
— the sign bit has the value -(2N - 1) (one’s complement).
"
The problem is that addition with one's complement is
not the same as addition with 2's complement. To
add two numbers, you have to perform different operations
depending on the signedness of the numbers, and that
is why 2's complement is preferred.

And one's complement and sign-magnitude have the advantage
of symmetric value range and others. There have been enough
threads on this.

Cheers
Michael
 
S

sarathy

Hi,
I guess -0 ==> 1111 1111 is correct in 1's complement notation.
-0 ==> 1000 0000 is in signed magnitude notation.

Please verify and revert back in case.

Rgrds,
Sarathy

Bill said:
Roy said:
1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

You did. In 1's complement, there is no unique representation for zero.
All 0's and all 1's are both equal to zero.

No, in 8-bit ones complement, zero is represented as either
0x00 or 0x80. 0xff is -127.

The problem is that addition with one's complement is
not the same as addition with 2's complement. To
add two numbers, you have to perform different operations
depending on the signedness of the numbers, and that
is why 2's complement is preferred.
 
B

Bill Pursell

Michael said:
Bill said:
Roy said:
1's complement ---> reverse all the bits
2's complement ---> reverse all the bits + 1

i.e 1's complement of 2 ( 0000 0010 ) is -2 ( 1111 1101 )
But when a number and its complement are added the result must be a
zero right ??
But in this case 0000 0010 + 1111 1101 = 1111 1111 ==> [ ?? ]
Should'nt we be getting a zero as result ???

You did. In 1's complement, there is no unique representation for zero.
All 0's and all 1's are both equal to zero.

No, in 8-bit ones complement, zero is represented as either
0x00 or 0x80. 0xff is -127.

8-bit ones complement? You mean sign and magnitude.

Oops. Of course.
of symmetric value range and others. There have been enough
threads on this.

Agreed!!
 
R

Richard Heathfield

Frederick Gotham said:
sarathy posted:



*Cringe*

I'd love to bludgeon to death the next person I hear utter that phrase.

Are you sure about that? Please verify and revert back in case.



(And now if you'll excuse me, I have a plane to catch. Or a starship. Or
something... TAXI!)
 
F

Frederick Gotham

Richard Heathfield posted:
Are you sure about that? Please verify and revert back in case.



(And now if you'll excuse me, I have a plane to catch. Or a starship. Or
something... TAXI!)


That phrase brings back horrible memories of working in an office full of
social retards. Never again.
 
A

Ancient_Hacker

Roy Smith wrote:
It's pretty much an obsolete concept as far as hardware design goes.

Not quite, many DSP-oriented CPU's use 1's complement arithmetic.

The advantage is, in a chain calculation, the negates and carries can
be computed separately and andded back at the end. With two's
complement the "add one" has to be done on each negate.
 
D

Dik T. Winter

J

J. J. Farrell

Frederick said:
sarathy posted:



*Cringe*

I'd love to bludgeon to death the next person I hear utter that phrase.

I've never come across it before; what does it mean? Am I allowed to
revert to any previous condition, or is a particular one implied?
 
J

Joe Wright

Dik said:
I would not trust a book by an author who does not know the difference
between 1-s complement and sign-magnitude. The last machine I had
access to that used 1-s complement was the CDC Cyber 750, and the
successor in 750 mode (both for int and for float).

Nobody doubts there were 1's complement iron, but when? The last CDC
machine I saw was the 160A in 1962 and I have no idea of its arithmetic
mode. In 1963 I learned the Philco 212/2000 system which was 2's
complement. Every machine I've seen since then is 2's complement for
integer arithmetic. That's 43 years. But I haven't seen them all.

What was the last 1's complement machine and when was it last produced?

I have never seen 'signed magnitude' integers on any machine.

Of course, IEEE floating point is signed magnitude. FP is not the issue.
 
R

Richard Bos

J. J. Farrell said:
I've never come across it before; what does it mean?

It's managementspeak. The presence of any meaning is purely optional.

Richard
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top