无符号整型文字越界

问题描述 投票:0回答:2

如果我定义一个

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
文字?

c++ literals unsigned unsigned-integer
2个回答
1
投票
不带任何后缀的

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<<
看到它之前就已经受到影响。在第二个示例中,该值按原样打印。


1
投票

4294967298u
unsigned long
,您可以在 cppinsights.io 上看到它,因为值
4294967298u
的类型取决于它的值 - 编译器会选择适合键入值的类型,但选择的类型不得窄于
unsigned int

  std::operator<<(std::cout.operator<<(4294967298UL), '\n');
© www.soinside.com 2019 - 2024. All rights reserved.