C++ 有/无符号整型整理
在做两数之和、三数之和、四数之和题目时,换了一个写法发现的问题
vector<int> vec={0};
cout<<typeid(vec.size()).name()<<endl;
cout<<vec.size()-2<<endl;
可以发现溢出了,原因是一般来讲,数组容量是不为负的,所以STL中vector的size记录的是一个无符号整型
具体而言:
数据类型 字节大小 数值范围
- 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字节 0 ~ 48 446 744 073 709 551 615
可以用climits来看一下
#include <iostream>
#include <climits> //limits.h
using namespace std;
int main() {
cout<<"signed:"<<endl;
cout << "char: " <<CHAR_MIN<<" - "<< CHAR_MAX << endl;
cout << "short: " <<SHRT_MIN<<" - "<< SHRT_MAX << endl;
cout << "int: " <<INT_MIN<<" - "<< INT_MAX << endl;
cout << "long: " <<LONG_MIN<<" - "<< LONG_MAX << endl;
cout << "long long: " <<LLONG_MIN<<" - "<< LLONG_MAX << endl;
cout<<endl<<"unsigned:"<<endl;
cout << "char: " <<0<<" - "<< UCHAR_MAX << endl;
cout << "short: " <<0<<" - "<< USHRT_MAX << endl;
cout << "int: " <<0<<" - "<< UINT_MAX << endl;
cout << "long: " <<0<<" - "<< ULONG_MAX << endl;
cout << "long long: " <<0<<" - "<< ULLONG_MAX << endl;
/*
char: 127
short: 32767
int: 2147483647
long: 2147483647
long long: 9223372036854775807
*/
return 0;
}
输出结果是
signed:
char: -128 - 127
short: -32768 - 32767
int: -2147483648 - 2147483647
long: -2147483648 - 2147483647
long long: -9223372036854775808 - 9223372036854775807
unsigned:
char: 0 - 255
short: 0 - 65535
int: 0 - 4294967295
long: 0 - 4294967295
long long: 0 - 18446744073709551615