使用宏初始化整数常量的对象

PSkocik

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf 7.20.4介绍宏整数常量用:

1以下类似函数的宏扩展为整数常量,适用于初始化具有与<stdint.h>中定义的类型相对应的整数类型的对象。每个宏名称都对应于7.20.1.2或7.20.1.5中的相似类型名称。

我不太理解这一段。宏基本上将适当的后缀拍打到未后缀的数字上,如下所示:

UINT64_C(0x123) => 0x123ULL

但是,如果我想初始化一个uint64_t中,我只想做:

uint64_t x = 0x123; 

而且我根本不会打扰后缀。

为什么需要这些宏在初始化?

让·弗朗索瓦·法布尔

UINT64_C(0x123)宏创建立即无符号长整数,因此可以将其用于变量参数函数(例如,实例计算或中间计算)中,而无需强制转换为uint64_t类型,在该类型中使用此特定数据类型很重要。

例:

printf("%llu\n",UINT64_C(0x123));

是正确的

printf("%llu\n",0x123);

不正确,是因为UB数据的大小是不正确的,并printf不能知道。

当您这样做时uint64_t x = 0x123;,会有一个赋值和一个隐式强制转换,因此不需要这样做(并且printf("%llu\n",x);是正确的)

另一个用途是在中间计算中,如下所示:

uint32_t a = 0xFFFFFFFF;
uint64_t x = a + UINT64_C(0xFFFFFFFF);

不会溢出,而

x = a + 0xFFFFFFFF;

将溢出,因为中间结果存储在 uint32_t

得出的结论是,UINT64_C(SOME_CONSTANT)之间的主要功能差异(uint64_t)SOME_CONSTANT是,如果值溢出,则肯定会在第一种情况下收到警告,而在另一种情况下会收到“转换”(也许会发出警告,但这取决于编译器)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章