我看到了
#define NUM_MAX_VOLUME 0ui64
在其他人的代码中
0ui64号码是多少?看来它不是十六进制数。
答案 0 :(得分:4)
我很惊讶有很多答案,但没有人指出我认为应该注意的官方和权威文件,所以这里是MSDN documentation:
unsigned-suffix:
之一 你好吗
和
64位整数后缀:
i64 LL ll
因此,它确实不是一个十六进制数,但基本上是一个宏定义为零,表示一个未加标签的64位整数。请注意,0Ui64
,0ULL
,0ull
等也是完全相同的。
当您想确保标志和尺寸是固定的,以便它不会出现意外或未定义的行为时,这是必要的。
这既不是标准的C ++,也不是C,而是Microsoft编译器功能。尽量避免它。
由于您的问题被标记为Qt,因此建议使用quint64和Q_UINT64_C代替跨平台工作。所以,你会写这样的东西:
#define NUM_MAX_VOLUME Q_UINT64_C(0)
答案 1 :(得分:3)
“ui64”表示无符号的64位整数。在某些情况下,它是非标准后缀。 “0ui64”只是0,我想这样写的原因是兼容性。
答案 2 :(得分:1)
它主要用于表达式,其中操作数的大小(此处的常量)很重要。以转移为例:
auto i = 1 << 36;
在int
长度为32位的计算机上will lead to undefined behaviour。由于1
此处被视为int
,因此您尝试将其移至结果类型的大小之外:int
。你想要的是一个64位整数类型,比如unsigned long long
然后你做
auto i = 1ULL << 36;
这不是UB,因为由于操作数(现在也是unsigned long long
),结果类型也将是unsigned long long
。
另一个例子是C ++ 11&#39} auto
关键字的类型推导。试试这个:
for (auto i = 0; i < v.size(); ++i)
启用警告GCC咆哮(live example)
警告:有符号和无符号整数表达式之间的比较[-Wsign-compare]
然而,将此更改为
for (auto i = 0u; i < v.size(); ++i)
使警告消失。同样,因为后缀0u
导致编译器将i
的类型推断为unsigned int
,而不仅仅是int
。
在您的情况下,您具有isn't standard C++的后缀ui64
,因此它应该是特定于实现的扩展,表示无符号的64位整数。
答案 3 :(得分:0)
0xFull
也是有效的C ++常量。在Microsoft编译器转录中为0xF,unsigned long long,a.k.a。 ui64 。