类型铸造差异

Ric*_*wal 1 c++ algorithm syntax

在以下代码中:

#include<cstdio>
#define max(a,b) (a>b?a:b)
using namespace std;

int main()
{
    int f=10000000;

    long long i=(long long)max(1000000,f*f);
    printf("%lld",i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到了输出

276447232

但如果我写

long long i=max((long long)1000000,(long long)f*f);
Run Code Online (Sandbox Code Playgroud)

我得到了输出

百兆

这两条线有什么区别?为什么在第一种情况下不会发生类型转换?

Cor*_*mer 6

这一行说:"取这两个int值的最大值,后者将溢出.然后取结果并将其转换为long long".到了的时候long long投被称为在第一种情况下,为时已晚.有符号整数溢出是未定义的行为.

long long i=(long long)max(1000000,f*f)
Run Code Online (Sandbox Code Playgroud)

这一行说:"取这两个long long值中的最大值并将其返回".原因之所以(long long)f*f有效,是因为它优先使用第一个f转换long long到乘法之前.f然后将第二个提升long long为乘法发生.

long long i=max((long long)1000000,(long long)f*f);
Run Code Online (Sandbox Code Playgroud)