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
C/C++的整型数据类型(一般情况,具体看编译器)

一直以为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。

posted @ 2021-01-03 22:30  UYNAIT  阅读(98)  评论(0)    收藏  举报