UL后缀vs uint32_t cast

时间:2016-02-18 13:54:33

标签: c c99

我必须定义这样的常量:

#define MY_CONSTANT   0xBEEF

我想确定我的常量将被视为32位。

我可以使用这样的(uint32_t)演员:

#define MY_CONSTANT   (uint32_t)0xBEEF

或者像这样的UL后缀:

#define MY_CONSTANT   0xBEEFUL

这两个版本完全相同吗?

我会说不,因为UL相当于unsigned longunsigned long长度可能取决于CPU。

C99标准确保uint32_t整数为32位,但我不认为它确保UL后缀的相同。

2 个答案:

答案 0 :(得分:4)

你是对的,因为你提到的原因,它们并不相同。我无法保证uint32_tunsigned long的别名。如有必要,请在#define中添加演员。

您应该使用括号,请参阅@Keith Thompson的评论,原因很简单;否则sizeof无法工作。

答案 1 :(得分:1)

uint32_t对应的后缀不一定是UL(在32位和64位架构上通常为U

除此之外,强制转换可能会截断一个更宽的整数常量,但其相应的后缀不会被抛弃,只会向上。

(有关后缀如何使用不同基数的整数常量,请参阅this table。)