c - UL 后缀与 uint32_t 转换

标签 c c99

我必须像这样定义常量:

#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 后缀也是如此。

最佳答案

你是对的,由于你提到的原因,它们并不等同。无法保证 uint32_tunsigned long 的别名。如有必要,将转换包含在 #define 中。

您应该使用括号,请参阅@Keith Thompson 的评论,这是一个很好的理由;否则 sizeof 将不起作用。

关于c - UL 后缀与 uint32_t 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35483362/

相关文章:

C - 区分字符和数字,然后进行相应处理

int16_t 到 int 的对话是否会导致实现定义的行为?

C99/C11 自引用子对象初始化可能吗?

c - 有什么方法可以在 C 中的 fscanf 中包含原始参数

c - Posix 正则表达式非捕获组

c - 解压.lz文件

从 argv 文件创建结构,并将内容打印到具有单独 header 的一个主文件中

c - 在C中的两个字符串之间添加空格

c - 将多维可变长度数组传递给函数

c - 如何按照其他代码在 Visual Studio C89 中声明可变长度数组