我必须定义这样的常量:
#define MY_CONSTANT 0xBEEF
我想确定我的常量将被视为32位。
我可以使用这样的(uint32_t)演员:
#define MY_CONSTANT (uint32_t)0xBEEF
或者像这样的UL后缀:
#define MY_CONSTANT 0xBEEFUL
这两个版本完全相同吗?
我会说不,因为UL相当于unsigned long
,unsigned long
长度可能取决于CPU。
C99标准确保uint32_t
整数为32位,但我不认为它确保UL
后缀的相同。
答案 0 :(得分:4)
你是对的,因为你提到的原因,它们并不相同。我无法保证uint32_t
是unsigned long
的别名。如有必要,请在#define
中添加演员。
您应该使用括号,请参阅@Keith Thompson的评论,原因很简单;否则sizeof
无法工作。
答案 1 :(得分:1)
与uint32_t
对应的后缀不一定是UL
(在32位和64位架构上通常为U
。
除此之外,强制转换可能会截断一个更宽的整数常量,但其相应的后缀不会被抛弃,只会向上。
(有关后缀如何使用不同基数的整数常量,请参阅this table。)