变量声明中的 U 后缀

U suffix in the variable declaration

我知道如果数字后跟 U 后缀,它将被视为无符号。但是为什么下面的程序打印变量 i 的正确值,即使它是用负值初始化的。 (使用 gcc 4.9.2、4.8.2 和 4.7.1 编译)

Program1.cpp

#include <iostream>
int main()
{
    int i=-5U;
    std::cout<<i;  // prints -5 on gcc 4.9.2, 4.8.2, & 4.7.1
}

Program2.cpp

#include <iostream>
int main()
{
    auto i=-5U;
    std::cout<<i;  // prints large positive number as output
}

但是,如果我使用 auto 关键字(类型推导器新的 C++0x 功能),它会给我预期的大正数。

如果我理解有误,请指正。

-5U 不是 -5 U。是-(5U)。减号是对 5U 进行运算的否定运算符,而不是整数文字的第一个字符。

对无符号数取反时,相当于2^n减去当前值,其中n为整型的位数。这就解释了第二个程序。至于第一个,当您将无符号整数转换为有符号整数时(就像您通过将其分配给 int 所做的那样),如果该值超出范围,则结果是未定义的行为,但通常*会导致在被重新解释为无符号整数的值中——并且由于无符号否定恰好与二进制补码有符号否定具有相同的行为,因此结果与否定发生在有符号上下文中相同。

.* 注意:这不是那些 "undefined behavior" 只对语言专家有学术关注的情况。编译器可以并且确实假设将无符号数转换为有符号数不会导致溢出(特别是当结果整数随后在循环中使用时),并且有已知的这种假设实例将粗心编写的代码变成错误的程序。