Path: utzoo!mnetor!uunet!sdrc!scjones From: scjones@sdrc.UUCP (Larry Jones) Newsgroups: comp.lang.c Subject: Re: Simple question about: ~ Message-ID: <198@sdrc.UUCP> Date: 27 Jan 88 04:57:33 GMT References: <1620006@hpcilzb.HP.COM> Organization: Structural Dynamics Research Corp., Cincinnati Lines: 36 Summary: 2's complement defined In article <1620006@hpcilzb.HP.COM>, tedj@hpcilzb.HP.COM (Ted Johnson) writes: > > Could someone please explain why the following statements both give the > same answer? > > x = -y -1; > x = ~y; Congratuations! You've just discovered "two's complement". This is the system that most current computers use for representing integer values. To fully understand it, you need to first understand "one's complement". In the one's complement, the negative of a number is represented by negating each bit of the number. For example, if you have the number 12 (00001100) then -12 is (11110011). This is called one's complement since adding a number to its negative results in a one in each bit position. This is what the ~ operator does, it complements each bit in a number. Although one's complement is a simple and easily understandable system, it has a number of disadvantages, not the least of which is that +0 and -0 each have representations. Since most people expect to have a single representation for zero, two's complement has become more popular. Two's complement is just like one's complement except that after you complement each bit, you add one to the result. Thus in two's complement notation -12 is (11110100). So, on a two's complement machine, -y == ~y + 1 which can be rearranged into the identity you discovered ~y == -y - 1. Please note, however, that this is NOT portable since there are still a few machines that use one's complement arithmetic rather than two's complement. -- ---- Larry Jones UUCP: uunet!sdrc!scjones SDRC MAIL: 2000 Eastman Dr., Milford, OH 45150 AT&T: (513) 576-2070 "When all else fails, read the directions."