我知道,如果数字后面带有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功能),它将为我提供预期的大正数。
如果我理解有误,请纠正我。
-5U不是-5 U
。是的-(5U)
。减号是对进行运算的否定运算符5U
,而不是整数文字的第一个字符。
对无符号数字求反时,等效于从中减去当前值2^n
,其中n
是整数类型的位数。这样就说明了第二个程序。对于第一个,当您将无符号整数转换为有符号整数时(如通过将其赋给int
),如果该值超出范围,则结果是未定义的行为,但通常*将导致该值被重新解释作为无符号整数-并且由于无符号取反恰好与二进制补码有符号取反的行为相同,因此结果与否定发生在有符号上下文中的结果相同。
。*注意:这不是那些只因语言问题而引起学术关注的“不确定行为”情况之一。编译器可以并且确实假定将无符号数转换为带符号数不会导致溢出(尤其是在将所得整数随后用于循环中时),并且这种假设的已知实例会将粗心编写的代码转换为错误的程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句