ermitz
ermitz

Reputation: 121

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.

Upvotes: 9

Views: 6120

Answers (2)

Petr Skocik
Petr Skocik

Reputation: 60117

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.)

Upvotes: 2

unwind
unwind

Reputation: 400029

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 #defines if necessary.

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

Upvotes: 6

Related Questions