关于int类型超出数据范围的一点讨论
今天在刷lc的时候碰巧遇到了这个问题,记录的同时也希望和大家一起讨论交流。
lc第150题,题目本身不难,使用堆栈去实现。但是实现的过程中会有int超出数据范围的错误:
以下是我的代码:
public:
int evalRPN(vector<string>& tokens) {
stack<int>s; // ???????
int n=tokens.size();
for(int i=0;i<n;i++)
{
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
int temp1=s.top();
s.pop();
int temp2=s.top();
s.pop();
if(tokens[i]=="+"){
s.push((long long)temp1+temp2);
}else if(tokens[i]=="*"){
s.push((long long)temp2*temp1); //?????????
}else if(tokens[i]=="/"){
s.push((long long)temp2/temp1);
}else{
s.push((long long)temp2-temp1);
}
continue;
}else{
s.push(atoi(tokens[i].c_str()));
}
}
return s.top();
}
};
出现错误的原因是我定义了一个存放int数据类型的堆栈,当结果为2147483648时就会出错,因为超出了int类型的表示范围,这些大家应该也都清楚。
然后我把数据类型强转为long long(如上面的代码所示),最终顺利通过。
好了,介绍完毕,正当我要进行下一道题的时候,我突然被一个问题所困扰:
在这一步代码中 s.push((long long)temp2*temp1);
其中的(long long)temp2*temp1
肯定是一个long long数据类型,这一点大家应该没什么疑问,但是我定义的stack是一个int类型啊,把一个long long类型的数据 push到stack中居然还能顺利通过?!
基于此,我在vs中进行了测试并且查阅了一些资料,我的测试代码:
{
stack<int>s;
int