443,665 Members | 1,258 Online
Need help? Post your question and get tips & solutions from a community of 443,665 IT Pros & Developers. It's quick & easy.

# Setting "all ones"

 P: n/a 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 Nov 14 '05 #1
5 Replies

 P: n/a 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 Nov 14 '05 #2

 P: n/a "pete" wrote in message news:42***********@mindspring.com... 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 Nov 14 '05 #3

 P: n/a In article <42***********@mindspring.com> pf*****@mindspring.com 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/ Nov 14 '05 #4

 P: n/a Alex Fraser wrote: "pete" wrote in message news:42***********@mindspring.com... 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 Nov 14 '05 #5

 P: n/a 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. Nov 14 '05 #6

### This discussion thread is closed

Replies have been disabled for this discussion.