Setting "all ones"

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

  1. 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
    #1
    1. Advertising

  2. John Devereux

    pete Guest

    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
    #2
    1. Advertising

  3. John Devereux

    Alex Fraser Guest

    "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
    #3
  4. 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
    #4
  5. John Devereux

    pete Guest

    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
    #5
  6. John Devereux

    Flash Gordon Guest

    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
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Srinivasa Raghavan Sethuraman
    Replies:
    0
    Views:
    565
    Srinivasa Raghavan Sethuraman
    Jun 30, 2004
  2. CJ
    Replies:
    1
    Views:
    1,578
    Andrew Thompson
    Oct 29, 2004
  3. Sile
    Replies:
    5
    Views:
    701
  4. Replies:
    0
    Views:
    480
  5. Replies:
    2
    Views:
    1,117
Loading...

Share This Page