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] 删除。
我来说两句