[C++11] 基础类型扩展解读(long long、char16_t char32_t)

说明:

long long是一种基本数据类型,它通常是一种至少64位的有符号整数类型。在C++中,long long类型能够存储的数值范围远远超过intlong类型,这使得它非常适合存储非常大的整数。

char16_tchar32_t是C++11标准引入的两种新的数据类型,它们用于支持Unicode字符集。

接下来我们看看为什么C++11要引入它们。👇

1 long long 类型

1.1 为什么C++11特性中引入long long类型?

在C++11中,long long类型被引入以提供更大的整数值表示能力,它至少具有64位的存储空间,使得我们能够处理更大的整数值。

这个类型在1995年6月之前就由罗兰·哈丁格(Roland Hartinger)提出申请加入C++标准,但当时的C++标准委员会以C语言中不存在这个基本类型为由,拒绝将这个类型加入C++中。

而就在C++98标准出台的一年后,C99标准就添加了long long这个类型,并且流行的编译器也纷纷支持了该类型。在此之后C++标准委员会才计划将整型long long加入标准中。

1.2 关于long long类型大小定义解读

long long大小及相关类型long、int、short的定义解读为:

sizeof(long long)>=sizeof(long)>=sizeof(int)>=sizeof(short)

所以具体的字节数是根据编译器来确定的。在64位系统中,long类型通常为8字节(64位)。

1.3 long long 类型使用详解

long long 的使用较为简单,直接定义即可。参考代码如下:

long long number = 1000000000000000;  // 定义一个 long long 类型的变量

2 char16_t、char32_t类型

2.1 为什么引入char16_t和char32_t这两种类型

C++11引入了char16_t和char32_t两种新的数据类型,主要是为了更好地支持国际化和Unicode字符集。详细解读如下:

  • Unicode字符集的需要:Unicode是一个国际标准,用于为世界上大多数的书写系统提供一个唯一的码位。它能够表示超过100,000个字符,包括标点符号、数学符号、技术符号以及表情符号等。
  • 现有类型的局限性:在C++11之前,标准库主要使用char类型来表示字符,它通常对应于一个字节(8位)。然而,对于Unicode字符集,一个字节的char无法表示所有的字符,因为许多字符的码位超出了一个字节的范围。
  • 固定长度字符类型:char16_t是一个至少占用16位的无符号整数类型,它足以表示Unicode的基本多文种平面(BMP),即码位范围在U+0000到U+FFFF之间的字符。char32_t是一个至少占用32位的无符号整数类型,它足以表示Unicode字符集中的所有字符,包括辅助平面的字符,码位范围在U+0000到U+10FFFF之间。
  • 编码和解码的便利:引入char16_t和char32_t允许开发者更方便地对Unicode字符串进行编码和解码,因为可以直接以固定长度的字符类型来处理字符,而不需要手动转换字节序或处理多字节序列。
  • 与C++标准库的兼容性:C++标准库中的字符串和字符处理函数,如std::string和std::u16string、std::u32string,使用这些新类型来支持Unicode字符串的存储和操作。
  • 国际化的支持:通过引入这些类型,C++11为开发者提供了更好的工具来处理国际化问题,使得程序能够更容易地支持多种语言和文化。
  • 与C++11标准相协调:C++11标准在多个方面进行了扩展和改进,包括对多线程、基于范围的for循环、基于自动类型的变量声明等的支持。引入char16_t和char32_t是这一改进过程的一部分,以确保C++能够适应现代软件开发的需求。
  • 未来兼容性:随着软件国际化需求的增加,对Unicode的支持变得越来越重要。C++11通过引入这些类型,为未来的Unicode扩展和国际化特性打下了基础。

尽管char16_t和char32_t为处理Unicode提供了基础,但在实际应用中,开发者可能仍然需要依赖第三方库,如ICU(International Components for Unicode),来处理更复杂的国际化问题,包括字符编码转换、格式化、排序和搜索等。

2.2 C++98标准中引入了wchar_t,为什么还要引入char16_t和char32_t?

C++98标准中引入的wchar_t类型是为了支持宽字符,它通常用于表示Unicode字符集中的字符。wchar_t的大小至少是16位,但具体的大小(16位、32位或更大)取决于编译器和平台的实现。wchar_t可以存储一个Unicode的码位,足以覆盖基本多文种平面(BMP),但不足以覆盖整个Unicode字符集。

尽管wchar_t在某些情况下可以用于国际化,但它存在一些局限性,这也是C++11引入char16_t和char32_t的原因:

  • 大小不统一:wchar_t的大小在不同的平台上可能不同,这可能导致跨平台的可移植性问题。
  • 表示范围有限:wchar_t的大小不足以表示所有的Unicode字符,尤其是辅助平面上的字符(码位在U+10000到U+10FFFF之间)。
  • 编码形式不明确:wchar_t并没有明确指出其使用的是哪种Unicode转换形式(如UTF-16或UTF-32)。这可能导致在不同的平台上,相同的wchar_t字符串可能有不同的字节序列。
  • 国际化支持不足:随着国际化需求的增加,开发者需要一种更加明确和统一的方式来处理Unicode字符。wchar_t在表示和处理Unicode字符串时存在局限性,特别是在处理辅助平面字符时。
  • 编码粒度更细:char16_t和char32_t提供了更细的编码粒度。char16_t对应于UTF-16编码,可以表示BMP中的所有字符。char32_t对应于UTF-32编码,可以表示整个Unicode字符集中的所有字符。
  • 更好的编码透明度:C++11标准通过引入char16_t和char32_t,以及相应的字符串类型std::u16string和std::u32string,提供了更明确的编码透明度,使得开发者可以更容易地理解和处理Unicode字符串。
  • 与C++11标准其他特性的一致性:C++11引入了许多现代化的特性,如基于范围的for循环、自动类型推断、基于右值引用的移动语义等。引入char16_t和char32_t是为了使标准库在国际化支持方面与其他特性保持一致。
  • 更好的工具和库支持:随着Unicode和国际化处理工具的发展,char16_t和char32_t提供了更好的支持,使得开发者可以更容易地使用这些工具和库。

总之,尽管wchar_t在某些情况下可以用于国际化,但它的局限性促使C++11引入了char16_t和char32_t,以提供更好的Unicode支持和国际化能力。这些新类型提供了更明确的大小、编码透明度和表示范围,有助于开发者创建更加国际化和可移植的软件。

2.3 char16_t、char32_t使用详解

char16_t和char32_t在C++11中引入,用以支持Unicode字符集。以下是一些使用这些类型的示例场景和代码案例。

2.3.1 创建和操作std::u16string

参考代码如下:

#include <iostream>
#include <string>int main() {// 创建一个std::u16string对象std::u16string u16str = u"Hello, 世界!";// 访问字符串中的字符for (char16_t ch : u16str) {std::cout << "U+" << std::hex << static_cast<uint_least16_t>(ch) << " ";}std::cout << std::endl;// 修改字符串内容u16str[6] = u'W'; // 将"世界"的"世"改为大写"W"// 输出修改后的字符串std::cout << "Modified UTF-16 String: " << u16str << std::endl;return 0;
}

解读:在这个Demo中,我们首先创建了一个std::u16string对象u16str,它是一个基于char16_t的字符串,用于存储UTF-16编码的文本。我们遍历字符串中的每个字符,并将每个char16_t字符转换为它的十六进制表示形式,然后输出。

接着,我们修改了字符串中的一个字符,将"世"改为大写"W"。UTF-16编码的字符串允许我们像操作普通字符串一样进行修改。

最后,我们输出了修改后的字符串,以展示结果。

2.3.2 使用char32_t和std::u32string

参考代码如下:

#include <iostream>
#include <string>int main() {// 使用char32_t的字符串字面量需要前缀Uchar32_t ch = U'🌐'; // Unicode字符,表示地球仪// 创建std::u32string对象std::u32string str = U"👋🌐"; // 使用u32string存储UTF-32编码的字符串// 将单个char32_t字符添加到u32string中str.push_back(ch);// 遍历字符串并输出每个字符的代码点for (char32_t c : str) {std::cout << "U+" << std::hex << static_cast<unsigned int>(c) << " ";}std::cout << std::endl;return 0;
}

解读:
在这个案例中,我们使用了char32_t来表示单个的UTF-32编码字符。UTF-32是一种固定长度的编码形式,每个Unicode字符都使用一个单独的char32_t值表示。

我们创建了一个std::u32string对象来存储UTF-32编码的字符串。std::u32string是C++11标准库中的另一个类模板实例化,用于处理UTF-32编码的字符串。

在遍历字符串时,我们使用static_cast<unsigned int>来获取char32_t的整数值,然后以十六进制格式输出。

2.3.3 转换为UTF-8并输出

由于C++标准库不支持直接将UTF-16或UTF-32转换为UTF-8,这里展示的是如何使用第三方库ICU或者平台相关的函数来进行转换。以下是使用伪代码表示转换逻辑的示例:
 

#include <iostream>
#include <string>
// 引入ICU头文件(需要安装ICU库)
#include <unicode/unistr.h>int main() {// 创建一个UTF-32字符串std::u32string u32str = U"👋🌐";// 使用ICU库将UTF-32转换为UTF-8icu::UnicodeString unicodeStr = icu::UnicodeString::fromUTF32(u32str.data(), u32str.size());std::string utf8Str;unicodeStr.toUTF8String(utf8Str);// 输出UTF-8编码的字符串std::cout << "UTF-8 String: " << utf8Str << std::endl;return 0;
}

解读:在这个Demo中,我们创建了一个std::u32string对象u32str,它包含两个辅助平面的Unicode字符(地球仪和挥手表情)。我们使用ICU库的UnicodeString类来执行从UTF-32到UTF-8的转换。fromUTF32方法接受UTF-32编码的字符数组和长度,创建一个UnicodeString对象。然后,我们使用toUTF8String方法将UnicodeString对象转换为UTF-8编码的std::string。最后,我们输出了转换后的UTF-8字符串。但是注意:

  • ICU(International Components for Unicode)是一个提供Unicode支持的成熟库,它包含了许多国际化和Unicode相关的工具和函数。
  • C++标准库本身不提供UTF-16、UTF-32到UTF-8的直接转换,因此通常需要依赖第三方库或平台特定的实现。

这些Demo展示了char16_t和char32_t在C++中的常见用法,包括创建和操作基于这些类型的字符串,以及如何将它们转换为UTF-8编码的字符串以便于输出和进一步处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring学习(三)——AOP

AOP是在不改原有代码的前提下对其进行增强 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;在不惊动原始设计的基础上为其进行功能增强&#xff0c;前面咱们有技术就可以实现这样的功能即代理模式。Java设计模式——代理模式-CSDN博客 基础概念 连接点&#xff08…

2024经常用且免费的10个网盘对比,看看哪个比较好用!

网盘在我们的工作和学习中经常会用到&#xff0c;也是存储资料的必备工具&#xff0c;有了它&#xff0c;我们就不用走到哪都带着移动硬盘了&#xff0c;而目前市场上的主流网盘还有数十款&#xff0c;其中有免费的也有付费的&#xff0c;各家不一&#xff0c;今天小编就来为您…

[Android]模拟器登录Google Play失败

问题&#xff1a; 模拟器登录Google Play失败&#xff0c;提示couldnt sign in there was a problem communicating with google servers. try again later. 原因&#xff1a; 原因是模拟器没有连接到互联网&#xff0c;打开模拟器中Google浏览器进行搜索一样不行。 解决&am…

移动硬盘(PSSD)中文件占用空间远大于文件大小

定义 文件的大小&#xff1a;文件内容实际具有的字节数&#xff0c;它以Byte为衡量单位&#xff0c;只要文件内容和格式不发生变化&#xff0c;文件大小就不会发生变化。 文件占用空间&#xff1a;文件在磁盘上的所占空间&#xff0c;它最小的计量单位是“簇(Cluster)”。 为…

MySQL高负载排查方法最佳实践(15/16)

高负载排查方法 CPU占用率过高问题排查 使用mpstat查看cpu使用情况。 # mpstat 是一款 CPU 性能指标实时展示工具 # 能展示每个 CPU 核的资源视情况&#xff0c;同时还能将资源使用情况进行汇总展示 # 如果CPU0 的 %idle 已经为 0 &#xff0c;说明此核已经非常繁忙# 打印所…

Istio介绍

1.什么是Istio Istio是一个开源的服务网格&#xff08;Service Mesh&#xff09;框架&#xff0c;它提供了一种简单的方式来为部署在Kubernetes等容器编排平台上的微服务应用添加网络功能。Istio的核心功能包括&#xff1a; 服务治理&#xff1a;Istio能够帮助管理服务之间的…

微服务之CircuitBreaker断路器

一、概述 1.1背景 在一个分布式系统中&#xff0c;每个服务都可能会调用其它的服务器&#xff0c;服务之间是相互调用相互依赖。假如微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其他的微服务。这就是构成所谓“扇出”。 如果扇出的链路上某个微服务的调…

状态压缩DP题单

P1433 吃奶酪&#xff08;最短路&#xff09; dp(i, s) 表示从 i 出发经过的点的记录为 s 的路线距离最小值 #include<bits/stdc.h> #define int long long using namespace std; const int N 20; signed main() { int n; cin >> n;vector<double>x(n 1),…

C++项目 -- 负载均衡OJ(三)online_judge

C项目 – 负载均衡OJ&#xff08;三&#xff09;online_judge 文章目录 C项目 -- 负载均衡OJ&#xff08;三&#xff09;online_judge一、基于MVC结构的oj服务设计1.结构与功能 二、oj_model.hpp1.建立文件版题库2.文件版题库的服务模块3. MySQL版题库3.1.创建名为oj_client的用…

【uniapp】引入uni-ui组件库

&#xff08;1&#xff09;新建项目的时候选择 uni-ui项目 &#xff08;2&#xff09;已经创建好的项目去官网单独安装 跳转单独安装组件 https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#%E9%80%9A%E8%BF%87-uni-modules-%E5%8D%95%E7%8B%AC%E5%AE%89%E8%A3%8…

202462读书笔记|《一世珍藏的诗歌200首》——你曾经羞赧地向我问起, 是谁最早在此留下足印

202462读书笔记|《一世珍藏的诗歌200首》——你曾经羞赧地向我问起&#xff0c; 是谁最早在此留下足印 《一世珍藏的诗歌200首》作者金宏宇&#xff0c;很多美好的诗&#xff0c;有徐志摩&#xff0c;戴望舒&#xff0c;林徽因&#xff0c;舒婷等的诗精选&#xff0c;很值得一读…

动态库和静态库

文章目录 一、 静态库二、动态库 一、 静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库&#xff0c;因为他已经在你字节写的程序中。 编译静态库 将所有的.h文件拷贝到lib/include中…

2024年腾讯云服务器价格一览表

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始选择使用云服务器来满足他们的数据存储和计算需求。腾讯云作为国内领先的云服务提供商&#xff0c;其服务器产品因性能稳定、安全可靠而备受用户青睐。那么&#xff0c;2024年腾讯云服务器的价格情况如何呢&#…

网络运输层之(3)GRE协议

网络运输层之(3)GRE协议 Author: Once Day Date: 2024年4月8日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

OpenHarmony多媒体-video_trimmer

简介 videotrimmer是在OpenHarmony环境下&#xff0c;提供视频剪辑能力的三方库。 效果展示&#xff1a; 安装教程 ohpm install ohos/videotrimmerOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考 如何安装OpenHarmony ohpm包 。 使用说明 目前支持MP4格式。 视频…

ansible模块实战-部署rsync服务端

目录 1、根据部署流程所用到的命令找出模块 2.实战部署 2.1 服务部署&#xff1a;yum 安装 2.2 准备好rsync服务的配置文件 &#xff0c;并将配置文件通过copy模块分发给192.168.81.136这台受控主机 2.3 创建虚拟机用户 2.4 创建密码文件和改权限 2.5 模块对应目录&…

《QT实用小工具·二十九》托盘图标控件

1、概述 源码放在文章末尾 托盘图标控件 可设置托盘图标对应所属主窗体。 可设置托盘图标。 可设置提示信息。 自带右键菜单。 下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef TRAYICON_H #define TRAYICON_H/*** 托盘图标控件* 1. 可设置托盘图标…

基于SpringBoot+Vue的大学生心理咨询系统(源码+文档+包运行)

一.系统概述 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在学生心理咨询评估信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次…

Unity解决:导出安卓apk 安装时报错:应用未安装:软件包似乎无效

Unity2018.4.36 导出安卓apk 安装时报错&#xff1a;应用未安装&#xff1a;软件包似乎无效 解决办法&#xff1a;因为安装到安卓12 需要添加添加过滤规则 在AS工程AndroidManifest.xml 添加过滤规则即可。 android:exported"true"

算法训练营第25天回溯(分割)

回溯算法&#xff08;分割&#xff09; 131.分割回文串 力扣题目链接(opens new window) 题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“…