变量声明中的U后缀

析构函数

我知道,如果数字后面带有U后缀,则将其视为无符号。但是,为什么下面的程序即使变量i初始化为负值也能打印正确的值。(与gcc 4.9.2、4.8.2和4.7.1一起编译)

程序1.cpp

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

程式2.cpp

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

但是,如果我使用auto关键字(类型推断器具有新的C ++ 0x功能),它将为我提供预期的大正数。

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

Sneftel

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

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

。*注意:这不是那些只因语言问题而引起学术关注的“不确定行为”情况之一。编译器可以并且确实假定将无符号数转换为带符号数不会导致溢出(尤其是在将所得整数随后用于循环中时),并且这种假设的已知实例会将粗心编写的代码转换为错误的程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章