变量声明中的 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" 只对语言专家有学术关注的情况。编译器可以并且确实假设将无符号数转换为有符号数不会导致溢出(特别是当结果整数随后在循环中使用时),并且有已知的这种假设实例将粗心编写的代码变成错误的程序。
我知道如果数字后跟 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" 只对语言专家有学术关注的情况。编译器可以并且确实假设将无符号数转换为有符号数不会导致溢出(特别是当结果整数随后在循环中使用时),并且有已知的这种假设实例将粗心编写的代码变成错误的程序。