Re: about CComboBox::GetItemData(int index) return value
On Wed, 29 Aug 2007 21:26:17 +0200, V?clav Jedli?ka
<vjedlicka@donotspam.cz> wrote:
Hello, I have a question:
Method DWORD CComboBox::GetItemData(int index)
returns the 32-bit value associated with the item, or CB_ERR if an error
occurs.
DWORD is defined as unsigned long, CB_ERR is -1,
How can -1 fall into the range of unsigned long?
By a standard conversion. When a negative value M is converted to an
unsigned type T with N bits, the result is the least value of T congruent
to M modulo 2^N. This means T(-1) with T an unsigned type produces the
largest value of T, the value with "all bits set". Note that 1+T(-1) == 0,
2+T(-2) == 0, etc, in this crazy scheme, so it isn't completely crazy after
all.
Just compare the result to CB_ERR and you'll be fine. You can get into
trouble if you decide that since -1 equals 0xFFFFFFFF for T(-1), you'll use
0xFFFFFFFF instead of -1 or CB_ERR, as the case may be. The problem is,
should T be widened to 64 bits, 0xFFFFFFFF will not widen with it, while
T(-1) will. But again, comparing to CB_ERR will avoid this issue. It does
kinda suck that this value is effectively forbidden for your data, and it
sucks even worse that the CM_GETITEMDATA mentions CB_ERR but does not give
its value, so you have to discover it some other way, probably by grepping
the Windows headers. That's a pet peeve of mine WRT the documentation;
often, it will give you the names of constants but not their values, and in
cases like this, knowing the value is essential.
--
Doug Harrison
Visual C++ MVP