相关疑难解决方法(0)

当二元运算符两边的签名不同时,促销规则如何工作?

考虑以下程序:

// http://ideone.com/4I0dT
#include <limits>
#include <iostream>

int main()
{
    int max = std::numeric_limits<int>::max();
    unsigned int one = 1;
    unsigned int result = max + one;
    std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)

// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>

int main()
{
    unsigned int us = 42;
    int neg = -43;
    int result = us + neg;
    std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)

+运算符如何"知道"返回哪个正确的类型?一般的规则是把所有的参数转换为最广泛的类型,但在这里没有明确的"赢家"之间intunsigned int.在第一种情况下,unsigned int必须选择作为结果operator+,因为我得到了结果2147483648.在第二种情况下,它必须选择int,因为我得到了结果-1.然而,在一般情况下,我没有看到这是如何可判定的.这是我看到的未定义的行为还是其他什么?

c++ arithmetic-expressions overflow integer-promotion

25
推荐指数
2
解决办法
8374
查看次数

整数提升,签名/未签名和printf

我正在查看C++ Integer Overflow和Promotion,尝试复制它,最后结束了这个:

#include <iostream>
#include <stdio.h>

using namespace std;

int main() {
    int i = -15;
    unsigned int j = 10; 
    cout << i+j << endl; // 4294967291
    printf("%d\n", i+j); // -5 (!)
    printf("%u\n", i+j); // 4294967291

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

cout做什么,我阅读上述职务后预期一样,第二printf:既打印4294967291.第一printf,然而,版画-5.现在,我的猜测是,这printf只是将无符号值4294967291解释为有符号值,最终为-5(这适合看到2的补码4294967291为11 ... 11011),但我不是100 %相信我没有忽视任何事情.那么,我是对的还是其他事情发生在这里?

c c++ integer-promotion language-lawyer

6
推荐指数
1
解决办法
1039
查看次数