简体   繁体   中英

UL suffix vs uint32_t cast

I have to define constants like this :

#define MY_CONSTANT   0xBEEF

I want to be sure that my constant will be considered 32 bits.

I have can use a (uint32_t) cast like this :

#define MY_CONSTANT   (uint32_t)0xBEEF

Or a UL suffix like this :

#define MY_CONSTANT   0xBEEFUL

Are these two versions fully equivalent?

I would say no, as UL is the equivalent of unsigned long and unsigned long length may depend on CPU.

The C99 standard ensures that an uint32_t integer is 32 bits, but I don't think it ensures that a UL suffix does the same.

You're right, they're not equivalent for the reason you mention. There's no guarantee that uint32_t is an alias for unsigned long . Include the cast in the #define s if necessary.

You should use the parentheses, see comment by @Keith Thompson for a very good reason why; otherwise sizeof won't work.

The suffix corresponding to uint32_t is not necessarily UL (it's usually U on 32 bit and 64 bit architectures).

Apart from that, a cast might possibly truncate an integer constant that's wider, but its corresponding suffix wouldn't ever cast down, only up.

(See this table for how suffixes work with integer constants in different bases.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM