无符号 int 文字越界

Raj*_*dhu 2 c++ unsigned literals unsigned-integer

如果我定义该unsigned int类型的变量并使用其范围之外的值对其进行初始化,那么它会使用模并为自己分配一个在其范围内的值,对吧?

例如:

unsigned int a = 4294967298;
std::cout << a << std::endl;
Run Code Online (Sandbox Code Playgroud)

将打印2.

但是,如果不是这样,我写:

std::cout << 4294967298u << std::endl
Run Code Online (Sandbox Code Playgroud)

它打印4294967298而不打印2

这是为什么?

我认为我们在这两个例子中做了几乎相同的事情。

是因为在第二个示例中,默认情况下文字不是int, butlong或其他东西,并且我们unsigned long通过添加u作为后缀将其转换为?那么,我们如何将它用作unsigned int文字呢?

Rem*_*eau 7

4294967298不带任何后缀的是intlong intlong long int,具体取决于编译器可以用来保存完整值而无需包装/截断它的最小类型。将此类类型分配给unsigned int变量可能会包装该值。

4294967298u后缀uunsigned int, unsigned long int, 或unsigned long long int(同样,取决于编译器的实现)。它不是(long) (long) int被转换成 的unsigned (long) (long) int

有关可用后缀和使用的数据类型的详细信息,请参阅cppreference.com 上的整数文字。

operator<<对于所有有符号和无符号整数类型都是重载的,因此它能够打印传递给它的任何类型所持有的任何值。在您的第一个示例中,该值在operator<<看到之前就已经受到影响。在第二个示例中,该值按原样打印。