如果我定义一个
unsigned int
类型的变量并用超出其范围的值初始化它,它会使用模并为自己分配一个在其范围内的值,对吗?
例如:
unsigned int a = 4294967298;
std::cout << a << std::endl;
将打印
2
。
但是,如果我不这么写,我会写:
std::cout << 4294967298u << std::endl
它打印
4294967298
而不是 2
。
这是为什么?
我认为我们在这两个示例中做了几乎相同的事情。
是不是因为在第二个例子中,文字不是
int
,而是默认的long
之类的东西,我们通过添加unsigned long
作为后缀将其转换为u
?在这种情况下,我们如何将它用作 unsigned int
文字?
4294967298
可以是 int
、long int
或 long long int
,具体取决于编译器可以用来保存完整值而无需包装/截断它的最小类型。将此类类型分配给 unsigned int
变量可能会包装该值。
带有 4294967298u
后缀的
u
可以是 unsigned int
、unsigned long int
或 unsigned long long int
(同样取决于编译器实现)。它不是 (long) (long) int
转换为 unsigned (long) (long) int
。
请参阅 cppreference.com 上的整数文字,了解有关可用后缀以及使用哪些数据类型的详细信息。
operator<<
对于所有有符号和无符号整数类型都是重载的,因此它能够打印传递给它的任何类型所持有的任何值。在您的第一个示例中,该值在 operator<<
看到它之前就已经受到影响。在第二个示例中,该值按原样打印。
4294967298u
是 unsigned long
,您可以在 cppinsights.io 上看到它,因为值 4294967298u
的类型取决于它的值 - 编译器会选择适合键入值的类型,但选择的类型不得窄于 unsigned int
。
std::operator<<(std::cout.operator<<(4294967298UL), '\n');