0ui64号码是多少?

时间:2014-12-04 06:26:50

标签: c++ qt

我看到了

 #define NUM_MAX_VOLUME 0ui64

在其他人的代码中

0ui64号码是多少?看来它不是十六进制数。

4 个答案:

答案 0 :(得分:4)

我很惊讶有很多答案,但没有人指出我认为应该注意的官方和权威文件,所以这里是MSDN documentation

  

unsigned-suffix:

之一      你好吗

  

64位整数后缀:

     

i64 LL ll

因此,它确实不是一个十六进制数,但基本上是一个宏定义为零,表示一个未加标签的64位整数。请注意,0Ui640ULL0ull等也是完全相同的。

当您想确保标志和尺寸是固定的,以便它不会出现意外或未定义的行为时,这是必要的。

这既不是标准的C ++,也不是C,而是Microsoft编译器功能。尽量避免它。

由于您的问题被标记为Qt,因此建议使用quint64Q_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