文章目录
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 mbrtoc16( char16_t* pc16, const char* s, size_t n, mbstate_t* ps );
size_t c16rtomb( char* s, char16_t c16, mbstate_t* ps );
size_t mbrtoc32( char32_t* pc32, const char* s, size_t n, mbstate_t* ps );
size_t c32rtomb( char* 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>>;