LeetCode day1 字符串转换整数
day1 字符串转换整数(有限状态机)
1、有限状态机的概念,怎么写?编译原理学过
class Solution {
public:
int myAtoi(string str) {
long res = 0;
int state = 0 ; // state == 0 为初始状态 ,1 为正整数状态 ,2为负整数
for(char i : str)
{
if(state == 0 && i == ' ')continue;
else if(state == 0 && i == '+')state = 1;
else if(state == 0 && i == '-')state = 2;
else if(i >= '0' && i <= '9')
{
if(state == 0)state = 1;
int tmp = i - '0';
res = res*10 + tmp;
if(res > INT_MAX)break;
}
else break;
}
if(state == 1 && res > INT_MAX)res = INT_MAX;
else if(state == 2)
{
res = -res;
if(res < INT_MIN)res = INT_MIN;
}
return res;
}
};
2、判断溢出的问题
| 数据类型 | 字节大小 | 数值范围 |
|---|---|---|
| short int (短整型) | 2 字节 | -32 768 〜+32 767 |
| unsigned short int (无符号短整型) | 2 字节 | 0 〜+65 535 |
| int (整型) | 4 字节 | -2 147 483 648 〜+2 147 483 647 |
| unsigned int (无符号整型) | 4 字节 | 0 〜4 294 967 295 |
| long int (长整型) | 4 字节 | -2 147 483 648 〜+2 147 483 647 |
| unsigned long int (无符号长整型) | 4 字节 | 0 〜4 294 967 295 |
| long long int (超长整型) | 8字节 | -9 223 372 036 854 775 808~9 223 372 036 854 775 807 |
| unsigned long long int (无符号超长整型) | 8字节 | 048 446 744 073 709 551 615 |
一直以为long long int类型是无符号数......既然int和long的范围是一样的,那int和long的区别是什么?
| 类型 | 16位系统/字节 | 32位系统/字节 | 64位系统/字节 |
|---|---|---|---|
| char | 1 | 1 | 1 |
| short | 2 | 2 | 2 |
| int | 2 | 4 | 4 |
| long | 4 | 4 | 4/8 |
| long long | 8 | 8 | 8 |
我又做了一个实验
#include<stdio.h>
int main(){
int t1;
long t2;
long long t3;
printf(" int:%d\n",sizeof(t1));
printf(" long:%d\n",sizeof(t2));
printf("long long:%d\n",sizeof(t3));
return 0;
}
编译器版本是TDM-GCC 4.9.2 64-bit Release,结果是:

总结如下:
1、64位系统下,编译器为了向前兼容,将int类型自动编译为4个字节的了;
2、这些个玩意儿就是编译器来控制的,不同的编译器将int类型编译成不同长度的,所以,使用什么编译器才是重要的,比如:32位系统,tc下的int就是16位长度的,VC就是32位长度的。64位系统,LeetCode上的C++编译成了8个字节,而dev上GCC编译为4字节。所以保险起见,long类型慎重使用。
3、long long是标准的8 bytes,不受编译器限制,所以,16位的依然也是8 bytes。

浙公网安备 33010602011771号