提问人:Rajdeep Sindhu 提问时间:7/26/2023 最后编辑:Remy LebeauRajdeep Sindhu 更新时间:7/26/2023 访问量:93
无符号 int 文本外部边界
An unsigned int literal outside bounds
问:
如果我定义一个类型的变量并使用其边界之外的值初始化它,它会使用模并在其范围内为自己分配一个值,对吧?unsigned int
例如:
unsigned int a = 4294967298;
std::cout << a << std::endl;
将打印 。2
但是,如果不是这样,我写:
std::cout << 4294967298u << std::endl
它打印而不是.4294967298
2
为什么?
我以为我们在这两个例子中都在做同样的事情。
是因为在第二个示例中,文字默认不是 ,而是 或 something,并且我们通过添加作为后缀将其转换为?在这种情况下,我们如何将其用作文字?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
是,您可以在 cppinsights.io 上看到它,因为值的类型取决于其值 - 编译器选择可以适合类型化值的类型,但选择的类型可能不比 窄。unsigned long
4294967298u
unsigned int
std::operator<<(std::cout.operator<<(4294967298UL), '\n');
评论