以下两个语句将导致编译器溢出错误(原因是默认情况下检查常量表达式是否溢出):
int i=(int)(int.MaxValue+100); // error
long l=(long)(int.MaxValue+100); // error
Run Code Online (Sandbox Code Playgroud)
但是,如果编译器能够弄清楚,添加两个值导致溢出,为什么没有那么促进双方int.MaxValue并100到long,然后才尝试将其加在一起?据我所知,这应该不是问题,因为根据以下引用,整数文字也可以是类型long:
当整数文字没有后缀时,它的类型是这些类型中的第一个,其值可以表示为:int,uint,long,ulong.
感谢名单
Bol*_*ock 10
文字100可以表示为a int,这是这四种类型中的第一种,所以它是一个int.
int.MaxValue是不是文字.它是类型的公共常量字段int.
因此,添加操作会int + int导致a int,然后在这种情况下溢出.
要将文字100转换为a,long以便执行长整数加法,请将其后缀为L:
long l = int.MaxValue + 100L;
Run Code Online (Sandbox Code Playgroud)
规则是:
因此,根据规范的正确行为是在编译时进行溢出检查并给出错误.
如果相反你说:
int x = 100;
int y = int.MaxValue;
long z = x + y;
Run Code Online (Sandbox Code Playgroud)
然后正确的行为是做一个未经检查的两个整数的加法,在溢出时回绕,然后将得到的整数转换为long.
如果您想要的是长算术,那么您必须这样说.将其中一个操作数转换为long.