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?
You should be able to cast it as an int to get rid of the warning.
(int)(1U << 31)
You'll want to make sure that it's actually doing what you want though.
I try to use unsigned 32bits in enum,
it is not possible?
In C, the type of an enumerator is int.
In C++, the type of an enumerator is its enumeration.
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.
View all questions in Keil forum