无符号 int 文本外部边界

An unsigned int literal outside bounds

提问人:Rajdeep Sindhu 提问时间:7/26/2023 最后编辑:Remy LebeauRajdeep Sindhu 更新时间:7/26/2023 访问量:93

问:

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

例如:

unsigned int a = 4294967298;
std::cout << a << std::endl;

将打印 。2

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

std::cout << 4294967298u << std::endl

它打印而不是.42949672982

为什么?

我以为我们在这两个例子中都在做同样的事情。

是因为在第二个示例中,文字默认不是 ,而是 或 something,并且我们通过添加作为后缀将其转换为?在这种情况下,我们如何将其用作文字?intlongunsigned longuunsigned int

C++ 文本 unsigned unsigned-integer

评论


答:

7赞 Remy Lebeau 7/26/2023 #1

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

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

有关哪些后缀可用以及使用哪些数据类型的详细信息,请参阅 cppreference.com 上的整数文本

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

2赞 273K 7/26/2023 #2

4294967298u是,您可以在 cppinsights.io 上看到它,因为值的类型取决于其值 - 编译器选择可以适合类型化值的类型,但选择的类型可能不比 窄。unsigned long4294967298uunsigned int

  std::operator<<(std::cout.operator<<(4294967298UL), '\n');