if v then return n or (n<<16) else return n<<16)
---->
if v then return n*0x10000 + n else return n*0x10000
Mmm, I'm afraid not exactly.
While <<16 and *0x10000 are interchangeable and we may even drop the
(v7_prop_attr_desc_t) member of the macro painlessly because it's effectively just a cast of
n to an unsigned long (cf.
typedef unsigned long v7_prop_attr_desc_t;) to shut up the C compiler's strict type checking, we
may not substitute
bitwise or with
addition here.
So, both
If v Then Return (n BitwiseOr (n << 16)) Else Return (n << 16)and
If v Then Return (n BitwiseOr (n * 0x10000)) Else Return (n * 0x10000)are safe for any given
n and their combinations be they signed or unsigned, original or cast, as long as we're
shifting to the left. When shifting to the right, we must also be aware of signed or unsigned
n shifts. In the case of signed negative
n, C will preserve its highest-order bit (the leftmost one in Calculator's binary number representation, or the 31st one in the 0..31 bit range) in its place while right shifting. OTOH the highest-order bit of an unsigned
n will be right-shifted down together with the other bits in this number. So, right shifts, if any, is where the
(v7_prop_attr_desc_t) cast would also matter.
But at any rate, for such a dramatic headlong dash to the left
addition is
only usable up to a certain "pivot point" where the total of bits in
n wouldn't exceed 0xFFFF0000, because any attempt to
add yet another bit (i.e. property attribute) to the total rather than
bitwise or them together would yield an entirely wrong total:
#AppType Console
? "test 0xFFFF0000"
test(0xffff0000)
? "-------------------------"
? "test 0xFFFF0001"
test(0xffff0001)
DynC test(%n)
void main(int n)
{
printf(" signed + : %d\n", n
+ (n
<< 16)); printf(" unsigned + : %u\n", n
+ (n
<< 16)); printf("(unsigned) + : %u\n", (unsigned)n
+ ((unsigned)n
<< 16)); printf(" signed | : %d\n", n
| (n
<< 16)); printf(" unsigned | : %u\n", n
| (n
<< 16)); printf("(unsigned) | : %u\n", (unsigned)n
| ((unsigned)n
<< 16)); }
End DynC
Pause
Output:
test 0xFFFF0000
signed + : -65536
unsigned + : 4294901760
(unsigned) + : 4294901760
signed | : -65536
unsigned | : 4294901760
(unsigned) | : 4294901760
-------------------------
test 0xFFFF0001
signed + : 1 <== All wrong! 1 means V7_PROPERTY_NON_WRITABLE!
unsigned + : 1 <== ditto
(unsigned) + : 1 <== ditto
signed | : -65535
unsigned | : 4294901761
(unsigned) | : 4294901761