Hello,
I have added U postfix to the integer but the problem still is the same.
I read following pages but didn't work. http://www.keil.com/support/docs/3243.htm http://www.keil.com/forum/14703/
#define M(x) (u32)(1U << (x%32)) enum{ eFirst = M(x) ..... eLast = M(31) // generate "integer operation result is out of range" }
Can I avoid this warning?
I try to use unsigned 32bits in enum,
On a 32-bit platforma, that ultimately cannot work.
The key problem is not with the enum's underlying integer type, though. It's with the enum values. An enum constant, by definition of the programming language, is always of type (signed) int. So even though the enum's underlying type may be uint32_t, on a 32-bit platform no enum value can equal (1UL << 31), because that's bigger than INT_MAX. The actual value of that thing will instead be an undefined result; most likely INT_MIN, i.e. -(1<<31)
1440 The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int.
Taken from:
c0x.coding-guidelines.com/6.7.2.2.html
Since int is signed, you cannot have a value greater that what can be put into an int. You are using a value beyond that limit, so you have a problem.
Thanks, you're right, enum must be portable and signed
If assuming a 32-bit machine with two-complement integers, the value
(int)(1u << 31)
would be possible to store in an enum for the C language.
But the actual value would be negative. So you would then need to continue to care about type casts to get your enumerated values to fold back into unsigned values again.
So it's better to let the enum just hold the bit positions (0..31) and in the actual code write (1u << bitname). The compiler will still see that both 1u and bitname are constants, allowing it to pre-compute the shifted value if the processor doesn't have a suitable instruction to do the shift on-the-fly.