变量声明中的U后缀

时间:2015-06-10 10:31:44

标签: c++ unsigned-integer

我知道如果数字跟随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功能),它会给我一个大的正数,如预期的那样。

请纠正我如果我理解不正确的事情。

1 个答案:

答案 0 :(得分:11)

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

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

。*注意:这不是那些&#34;未定义的行为&#34;只有学术上关注语言的情况。编译器可以并且确实假设将无符号数转换为signed将不会导致溢出(特别是当然后在循环中使用结果整数时),并且已知这种假设的实例将不小心编写的代码转换为错误的程序。