代码之家  ›  专栏  ›  技术社区  ›  infinite loop

为什么最负的int值会导致关于不明确函数重载的错误?

  •  91
  • infinite loop  · 技术社区  · 9 年前

    我正在学习C++中的函数重载,并遇到了以下问题:

    void display(int a)
    {
        cout << "int" << endl;
    }
    
    void display(unsigned a)
    {
        cout << "unsigned" << endl;
    }
    
    int main()
    {
        int i = -2147483648;
        cout << i << endl; //will display -2147483648
        display(-2147483648);
    }
    

    据我所知 int 范围(在我的情况下 是4字节)将调用 display(int) 并且任何超出此范围的值都是不明确的(因为编译器无法决定调用哪个函数)。它适用于以下所有范围: 整数 除最小值外的其他值,即。 -2147483648 其中编译失败并出现错误

    重载调用 display(long int) 不明确

    但将相同的值带到 打印出的值 2147483648 .我真的对这种行为感到困惑。

    为什么只有在传递最负数时才观察到这种行为?(如果 short -32768 -事实上,在任何情况下,负数和正数具有相同的二进制表示)

    3 回复  |  直到 9 年前
        1
  •  145
  •   Cody Gray Felix    9 年前

    这是一个非常微妙的错误。您看到的是C++中不存在负整数文字的结果。如果我们看看[雷克斯·伊肯]我们会得到一个 整数文字


    十进制文字整数后缀 选择

    可以是一个 ,

    十进制文字:

    十进制文字 选择 数字

    数字 [0-9] 非零数字 [1-9] 后缀par可以是 u , U l , L , ll LL .这里不包括 - 作为十进制文字的一部分。

    是一个没有周期或指数部分的数字序列,带有可选的分隔单引号,在确定其值时忽略这些单引号。整数文字可以有一个指定其基的前缀和一个指定其类型的后缀。数字序列中词汇上的第一个数字是最重要的。 十进制的

    (强调矿山)

    这意味着 - 在里面 -2147483648 operator - .这意味着 -2147483648 实际上被视为 -1 * (2147483648) 自从 2147483648 int long int

    std::numeric_limits<type>::min();  // or max()
    
        2
  •  36
  •   François Andrieux    7 年前

    表达式 -2147483648 实际上正在应用 - 2147483648 .在你的平台上, int 无法存储 2147483648 -2147483648 signed int 但更大的有符号类型, signed long int

    因为您没有为 long

        3
  •  4
  •   bunkerdive    9 年前

    扩展他人的答案


    为了澄清OP混淆的原因,首先 signed int 的二进制表示 2147483647

    Largest signed int




    接下来,在这个数字上加一个 有符号整型 属于 -2147483648 (OP希望使用) Smallest signed int



    我们可以看出为什么OP在 编译为 long int 而不是 有符号整型 ,因为它显然适合32位。

    但是,正如当前的答案所提到的,一元运算符( - )已应用 正在解析 2147483648 长整型 并且不适合32位。

    推荐文章