M
Marcel Müller
The following code generates a warning about an singned/unsigned integer
comparison. I don't understand why.
typedef enum
{ TATTR_NONE = 0x00U
, TATTR_SONG = 0x01U
, TATTR_PLAYLIST = 0x02U
, TATTR_INVALID = 0x08U
, TATTR_WRITABLE = 0x10U
} ATTRIBUTES;
inline static ATTRIBUTES operator|(ATTRIBUTES l, ATTRIBUTES r) \
{ return (ATTRIBUTES)((unsigned)l|r); } \
inline static ATTRIBUTES operator&(ATTRIBUTES l, ATTRIBUTES r) \
{ return (ATTRIBUTES)((unsigned)l&r); } \
inline static ATTRIBUTES& operator|=(ATTRIBUTES& l, ATTRIBUTES r) \
{ return l = (ATTRIBUTES)((unsigned)l|r); } \
inline static ATTRIBUTES& operator&=(ATTRIBUTES& l, ATTRIBUTES r) \
{ return l = (ATTRIBUTES)((unsigned)l&r); } \
inline static ATTRIBUTES operator*(bool l, ATTRIBUTES r) \
{ return (ATTRIBUTES)(-l&(unsigned)r); } \
inline static ATTRIBUTES operator*(ATTRIBUTES l, bool r) \
{ return (ATTRIBUTES)((unsigned)l&-r); } \
inline static ATTRIBUTES operator~(ATTRIBUTES a) \
{ return (ATTRIBUTES)~(unsigned)a; }
static unsigned tattr = TATTR_NONE;
int main()
{ if ( (tattr & (TATTR_PLAYLIST|TATTR_WRITABLE|TATTR_INVALID))
== (TATTR_PLAYLIST|TATTR_WRITABLE) )
return 1;
return 0;
}
It seems that the expression
(unsigned) & (enum type)
always evalueates to signed int regardless of the definition of the enum
constants.
Are enums always signed? And if so, why is
enum X
{ value = UINT_MAX
};
not an error?
Marcel
comparison. I don't understand why.
typedef enum
{ TATTR_NONE = 0x00U
, TATTR_SONG = 0x01U
, TATTR_PLAYLIST = 0x02U
, TATTR_INVALID = 0x08U
, TATTR_WRITABLE = 0x10U
} ATTRIBUTES;
inline static ATTRIBUTES operator|(ATTRIBUTES l, ATTRIBUTES r) \
{ return (ATTRIBUTES)((unsigned)l|r); } \
inline static ATTRIBUTES operator&(ATTRIBUTES l, ATTRIBUTES r) \
{ return (ATTRIBUTES)((unsigned)l&r); } \
inline static ATTRIBUTES& operator|=(ATTRIBUTES& l, ATTRIBUTES r) \
{ return l = (ATTRIBUTES)((unsigned)l|r); } \
inline static ATTRIBUTES& operator&=(ATTRIBUTES& l, ATTRIBUTES r) \
{ return l = (ATTRIBUTES)((unsigned)l&r); } \
inline static ATTRIBUTES operator*(bool l, ATTRIBUTES r) \
{ return (ATTRIBUTES)(-l&(unsigned)r); } \
inline static ATTRIBUTES operator*(ATTRIBUTES l, bool r) \
{ return (ATTRIBUTES)((unsigned)l&-r); } \
inline static ATTRIBUTES operator~(ATTRIBUTES a) \
{ return (ATTRIBUTES)~(unsigned)a; }
static unsigned tattr = TATTR_NONE;
int main()
{ if ( (tattr & (TATTR_PLAYLIST|TATTR_WRITABLE|TATTR_INVALID))
== (TATTR_PLAYLIST|TATTR_WRITABLE) )
return 1;
return 0;
}
It seems that the expression
(unsigned) & (enum type)
always evalueates to signed int regardless of the definition of the enum
constants.
Are enums always signed? And if so, why is
enum X
{ value = UINT_MAX
};
not an error?
Marcel