数字 0ui64 是多少

What is the number 0ui64?

本文关键字:多少 0ui64 数字      更新时间:2023-10-16

我看到

 #define NUM_MAX_VOLUME 0ui64

在其他人的代码中

数字 0ui64 是多少? 不过,它似乎不是一个十六进制数字。

我很

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

无符号后缀:以下之一

u U

64 位整数后缀:

i64 LLll

因此,它确实不是一个六边形数字,而基本上是一个定义为零的宏,表示一个未确定的 64 位整数。请注意,0Ui640ULL0ull等也都是一样的。

当您想要确保符号和大小是固定的,以便它不会发生意外或未定义的行为时,这是必需的。

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

由于您的问题被标记为Qt,因此建议使用quint64和Q_UINT64_C,这将跨平台工作。所以,你会写这样的东西:

#define NUM_MAX_VOLUME Q_UINT64_C(0)
">

ui64"表示无符号的64位整数。在某些情况下,它是一个非标准后缀。"0ui64"只是0,我想这样写的原因是为了兼容性。

它基本上用于操作数的大小(此处的常量(很重要的表达式中。以换档为例:

auto i = 1 << 36;

int长度为 32 位的计算机上,这将导致未定义的行为。由于此处的1被视为int,并且您正在尝试将其移动到结果类型的大小之外:int 。你想要的是一个 64 位整数类型,比如说unsigned long long然后你会做的

auto i = 1ULL << 36;

这不是 UB,因为由于操作数(现在也是一个unsigned long long(,生成的类型也将是一个unsigned long long

另一个例子是C++11的auto关键字的类型推断。试试这个:

for (auto i = 0; i < v.size(); ++i)

启用警告 GCC 吠叫(实时示例(

警告:有符号和无符号整数表达式之间的比较 [-Wsign-compare]

但是,将其更改为

for (auto i = 0u; i < v.size(); ++i)

使警告消失。同样,由于后缀0u导致编译器推断出i的类型unsigned int,而不仅仅是int

在您的情况下,您的后缀ui64不是标准C++,因此它应该是特定于实现的扩展,表示无符号的 64 位整数

例如,

0xFull也是有效的C++常量。它是0xF的,无符号的长长,又名ui64在Microsoft编译器转录中。