Win7(64位)+Code::Blocks17.12环境下。下面两段代码的差别是什么?
void main()
{
int a;
a=2147483647+1;
}
void main()
{
int a;
a=2147483648;
}
为什么第一段编译时提示溢出错误,第二段却编译正确。
Win7(64位)+Code::Blocks17.12环境下。下面两段代码的差别是什么?
void main()
{
int a;
a=2147483647+1;
}
void main()
{
int a;
a=2147483648;
}
为什么第一段编译时提示溢出错误,第二段却编译正确。
2147483647和1都默认是int类型,所以编译器在计算的时候,默认结果也认为是int类型,编译器在将2147483648这个计算结果赋值给int变量时,会进行安全性检查,这个结果超出最大整数范围,所以编译器会报错。
但是,int a = 2147483648这么写的时候,编译器只把2147483648作为一个数字常量,并用二进制存储,但是,因为编译器无法判断这个数的正负性,就像0XFF这个数,你可以认为他是正数,也可认为它是负数,因为没有明确的符号来说明这个数的正负性,同理2147483648这个数,编译器也无法判断用户的目的是想输入正数还是负数,负数的话是不越界的,所以这么写的时候,编译器不会报错。