Skip to content

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