变量声明中的U后缀

U suffix in the variable declaration

本文关键字:后缀 声明 变量      更新时间:2023-10-16

我知道,如果数字后面跟着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),如果该值为范围的结果是未定义的行为但总的来说*将导致被重新解释为一个无符号整数的值,因为无符号否定这样会有相同的行为作为两个补充签署了否定,结果都是一样的,如果发生在一个否定签署上下文。

。*注意:这不是那些"未定义的行为"的情况之一,只是学术关注的语言工作。编译器可以并且确实假设将无符号数转换为有符号数不会导致溢出(特别是当生成的整数随后在循环中使用时),并且已知这种假设的实例会将粗心编写的代码变成有问题的程序。