WHCSRL 技术网

新基础类型(C++11~C++20)

整数类型long long

long long该类型实际上我们很早就开始使用了,但是是直到C++11才加入标准中的;
long一般表示一个32位的整型,long long一般表示64位的整型;
long long是一个有符号的整型,对应无符号是unsigned long long;
C++标准顶定义,long long至少是一个64位的整型,注意,这里是至少,说明某些平台可能比这个还要大。

定义是可以使用LL和ULL进行区分:

long long a = 10000;
long long b = 10ll;
unsigned long long c = 2;
unsigned long long d = 3ull;
auto d = 9999999ll;
  • 1
  • 2
  • 3
  • 4
  • 5

获取当前平台C++编译器中long long等类型数的最值:

#include <iostream>
#include <limits>

int main() {
  std::cout << "long max = " << std::numeric_limits<long>::min() << std::endl;
  std::cout << "long max = " << std::numeric_limits<long>::max() << std::endl;

  std::cout << "unsigned long min = "
            << std::numeric_limits<unsigned long>::min() << std::endl;
  std::cout << "unsigned long min = "
            << std::numeric_limits<unsigned long>::max() << std::endl;

  std::cout << "long long min = " << std::numeric_limits<long long>::min()
            << std::endl;
  std::cout << "long long max = " << std::numeric_limits<long long>::max()
            << std::endl;

  std::cout << "unsigned long long min = "
            << std::numeric_limits<unsigned long long>::min() << std::endl;
  std::cout << "unsigned long long max = "
            << std::numeric_limits<unsigned long long>::max() << std::endl;

  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出结果:

long min = -9223372036854775808
long max = 9223372036854775807
unsigned long min = 0
unsigned long max = 18446744073709551615
long long min = -9223372036854775808
long long max = 9223372036854775807
unsigned long long min = 0
unsigned long long max = 18446744073709551615
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

新字符类型 char16_t 和 char32_t

C++11标准添加 这两种类型是为了应对Unicode字符集的UTF-16和UTF-32两种编码方式;
在此标准出现之前,使用char类型处理UTF-8编码的字符,但是对于UTF-16,与UTF-32则没有;

C++11为这三种编码方式提供新前缀:

u8:char    该类型在c++11,c++14中无法编译,只能在支持c++17起的编译器进行编译
u :char16_t
U :char32_t
  • 1
  • 2
  • 3

定义变量或者数组的时候,和char有一点点区别,需要加前缀:

  char a = u8'a';
  char16_t b = u'好';
  char32_t c = U'好';
  char16_t d[] = u"你是真的好";
  char32_t e[] = U"你是真的好";
  • 1
  • 2
  • 3
  • 4
  • 5

在linux系统中使用g++进行编译时,需要使用-std=c++17开始的标准进行编译,否则变量a会无法编译通过。

c++标准库已经添加了对新字符类型的支持:

using u16string = basic_string<char16_t >;
using u32string = basic_string<char32_t >;
using wstring = basic_string<wchar_t>;
  • 1
  • 2
  • 3

基本的使用:

  std::u16string f = u"123456";
  std::u32string g = U"456789";
  std::wstring   h = L"0123";
  • 1
  • 2
  • 3
推荐阅读