C++11~20核心特性(1)新基础类型

1. 整数类型long long (c++11)

1.1 long long是一个至少为64位的整数类型

请注意这里的用词“至少”,也就说long long的实际长度可能大于64位。不过至今也没有遇到大于64位长度的long long。

1.2 对应的无符号类型为unsigned long long

当然读者可能看到过诸如long long int、unsigned long long int等类型,实际上它们和long long、unsigned long long具有相同的含义。

1.3 LL和ULL作为这两种类型的字面量后缀

例如:

long long x = 65536LL;
unsigned long long y = 65536ULL;

1.4 表示范围

  • 通过宏获取
    #define LLONG_MAX 9223372036854775807LL        // long long的最大值
    #define LLONG_MIN (-9223372036854775807LL - 1) // long long的最小值
    #define ULLONG_MAX 0xffffffffffffffffULL       // unsigned long long的最大值
  • 通过numeric_ limits类模板获取
    std::numeric_limits<long long>::max();
    std::numeric_limits<long long>::min();
    std::numeric_limits<unsigned long long>::max();

1.5 printf对应的格式符

std::printf("LLONG_MAX = %lld\n", LLONG_MAX);
std::printf("LLONG_MIN = %lld\n", LLONG_MIN);
std::printf("ULLONG_MAX = %llu\n", ULLONG_MAX);

使用%lld和%llu来格式化有符号和无符号的long long整型。

2. char16_t和char32_t (c++11)

char16_t和char32_t,分别对应UTF-16和UTF-32。对于UTF-8,一般直接使用char。

2.1 代码示例

char utf8c = u8'a';      // C++17标准,支持u8修饰单个字符。
//char utf8c = u8'好';   // 无法编译通过,'好'占用3个字节,一个char放不下。
char16_t utf16c = u'好';
char32_t utf32c = U'好';
char utf8[] = u8"你好世界";
char16_t utf16[] = u"你好世界";
char32_t utf32[] = U"你好世界";

2.2 wchar_t存在的问题

wchar_t没有规定其占用内存的大小。

  • 在Windows上wchar_t是一个16位长度的类型(2字节)
  • 在Linux和macOS上wchar_t却是32位的(4字节)

这导致代码无法在不同平台上保持相同行为。

2.3 类型的转换

  • C11增加了4个转换函数
    size_t mbrtoc16char16_t* pc16, const char* s, size_t n, mbstate_t* ps );
    size_t c16rtombchar* s, char16_t c16, mbstate_t* ps );
    size_t mbrtoc32char32_t* pc32, const char* s, size_t n, mbstate_t* ps );
    size_t c32rtombchar* s, char32_t c32, mbstate_t* ps );
  • C++11也添加了转换类:std::wstring_convert以及std::codecvt。(C++17不再推荐使用它们)

2.4 对应的对象类型

using string  = basic_string<char, char_traits<char>, allocator<char>>;
using wstring = basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>>;
using u16string = basic_string<char16_t, char_traits<char16_t>, allocator<char16_t>>;
using u32string = basic_string<char32_t, char_traits<char32_t>, allocator<char32_t>>;

3. char8_t字符类型

  • 使用char类型无法区分普通字符和UTF-8字符,C++20标准引入新类型char8_t。
    char str[] = u8"text"// C++17编译成功;C++20编译失败,需要char8_t
    char c = u8'c';
    char8_t c8a[] = "text"// C++20编译失败,需要char
    char8_t c8 = 'c';
  • 库函数也有相应的增加
    size_t mbrtoc8(char8_t* pc8, const char* s, size_t n, mbstate_t* ps);
    size_t c8rtomb(char* s, char8_t c8, mbstate_t* ps);
    using u8string = basic_string<char8_t, char_traits<char8_t>, allocator<char8_t>>;
建站  ·  开发  ·  读书  ·  教程
↑长按或扫码关注“编程之海”公众号↑
↑长按或扫码关注“编程之海”公众号↑
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论

0

0

463

0
希望看到您的想法,请您发表评论x