# Setting "all ones"

Discussion in 'C Programming' started by John Devereux, May 19, 2005.

1. ### John DevereuxGuest

I was wondering what is the "best" way to set a variable to "all
ones". In particular where I do not know the precise type of the
variable (or more accurately, when I don't want to worry about it!).

E.g. assume "a" is unsigned, but could be char, short, int or long.

a = -1;

or

a = ~0;

Would these always work? (I only care about machines with 2's
complement arithmetic).

Thanks,

--

John Devereux

John Devereux, May 19, 2005

2. ### peteGuest

John Devereux wrote:
>
> I was wondering what is the "best" way to set a variable to "all
> ones". In particular where I do not know the precise type of the
> variable (or more accurately, when I don't want to worry about it!).
>
> E.g. assume "a" is unsigned, but could be char, short, int or long.
>
> a = -1;

Yes, always

>
> or
>
> a = ~0;

Should be ~0u, instead.
The type of ~0 is int,
and the value of ~0 depends on binary representation.
In sign and magnitude, ~0 is -INT_MAX.
In one's complement ~0 is negative zero, equal to zero.
Assignement is by value.

> Would these always work? (I only care about machines with 2's
> complement arithmetic).

Since it's easy to avoid two's complement issues, you should.

--
pete

pete, May 19, 2005

3. ### Alex FraserGuest

"pete" <> wrote in message
news:...
> John Devereux wrote:
> > I was wondering what is the "best" way to set a variable to "all
> > ones". In particular where I do not know the precise type of the
> > variable (or more accurately, when I don't want to worry about it!).
> >
> > E.g. assume "a" is unsigned, but could be char, short, int or long.
> >
> > a = -1;

>
> Yes, always
>
> > or
> >
> > a = ~0;

>
> Should be ~0u, instead.

But that will only set up to as many bits as there are in an (unsigned) int.
~0 will always work for two's complement because it produces the value -1
(of type int), making it equivalent to the first method. However, as you
pointed out, it produces different values for other signed integer
representations.

Alex

Alex Fraser, May 19, 2005
4. ### Dik T. WinterGuest

In article <> writes:
> John Devereux wrote:
> > I was wondering what is the "best" way to set a variable to "all
> > ones". In particular where I do not know the precise type of the
> > variable (or more accurately, when I don't want to worry about it!).

....
> > E.g. assume "a" is unsigned, but could be char, short, int or long.
> > a = -1;

>
> Yes, always
>
> > a = ~0;

>
> Should be ~0u, instead.
> The type of ~0 is int,
> and the value of ~0 depends on binary representation.
> In sign and magnitude, ~0 is -INT_MAX.
> In one's complement ~0 is negative zero, equal to zero.
> Assignement is by value.

Yup, the value is not -1, but all bits are set to 1. This contradicts
your first "yes always".
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/

Dik T. Winter, May 19, 2005
5. ### peteGuest

Alex Fraser wrote:
>
> "pete" <> wrote in message
> news:...
> > John Devereux wrote:
> > > I was wondering what is the "best" way to set a variable to "all
> > > ones". In particular where I do not know the precise type of the
> > > variable
> > > (or more accurately, when I don't want to worry about it!).
> > >
> > > E.g. assume "a" is unsigned,
> > > but could be char, short, int or long.
> > >
> > > a = -1;

> >
> > Yes, always
> >
> > > or
> > >
> > > a = ~0;

> >
> > Should be ~0u, instead.

>
> But that will only set up to as many bits
> as there are in an (unsigned) int.
> ~0 will always work for two's complement because
> it produces the value -1 (of type int),
> making it equivalent to the first method. However, as you
> pointed out, it produces different values for other signed integer
> representations.

I neglected to read this part:

> > > but could be char, short, int or long.

--
pete

pete, May 19, 2005
6. ### Flash GordonGuest

John Devereux wrote:
> I was wondering what is the "best" way to set a variable to "all
> ones". In particular where I do not know the precise type of the
> variable (or more accurately, when I don't want to worry about it!).
>
> E.g. assume "a" is unsigned, but could be char, short, int or long.
>
> a = -1;
>
> or
>
> a = ~0;
>
> Would these always work? (I only care about machines with 2's
> complement arithmetic).

For any unsigned type on any system (even those that are not 2s complement)
a = -1;
This is because of the way conversion to unsigned types is defined in C.

I think that a = ~1; will work on a 2s complement machine because it
takes a signed int 0, inverts all bits giving you a signed int -1, then
the rules for assigning -1 to an unsigned int make it work.

So in this instance there is no real cost to making it fully portable.
--
Flash Gordon
Living in interesting times.
Although my email address says spam, it is real and I read it.

Flash Gordon, May 19, 2005