C++新基础类型long long, char8_t, char16_t, char32_t

news2024/11/19 4:19:58

C++新基础类型long long, char8_t, char16_t, char32_t

  • 一、整数类型 long long
  • 二、新字符类型 char16_t 和 char32_t
  • 三、char8_t 字符类型

一、整数类型 long long

我们知道long通常表示一个32位整型,而long long则是用来表示一个64位的整型。

C++标准中定义,long long是一个至少为64位的整数类型。请注意这里的用词“至少”,也就说long long的实际长度可能大于64位。

另外,
long long是一个有符号类型,对应的无符号类型为unsignedlong long,当然读者可能看到过诸如long long int、unsigned long long int等类型,实际上它们和long long、unsigned long long具有相同的含义。C++标准还为其定义LL和ULL作为这两种类型的字面量后缀,所以在初始化long long类型变量的时候可以这么写:

long long x = 65536LL;

当然,这里可以忽略LL这个字面量后缀,直接写成下面的形式也可以达到同样的效果:

long long x = 65536;

要强调的是,字面量后缀并不是没有意义的,在某些场合下我们必须用到它才能让代码的逻辑正确,比如下面的代码:

#include <iostream>

using namespace std;

int main(int, char **)
{
    long long x1 = 65536 << 16;
    cout << "x1=" << x1 << endl;

    long long x2 = 65536LL << 16;
    cout << "x2=" << x2 << endl;
}

以上代码的目的是将65536左移16位,以获得一个更大的数值。但是,x1计算出来的值却是0,没有增大反而减小了。原因是在没有字面量后缀的情况下,这里的65536被当作32位整型操作,在左移16位以后,这个32位整型的值变成了0,所以事实是将0赋值给了x1,于是我们看到x1输出的结果为0。而在计算x2的过程中,代码给65536添加了字面量后缀LL,这使编译器将其编译为一个64位整型,左移16位后仍然可以获得正确的结果:4294967296(0x100000000)。

有些编译器可能在编译long long x1 = 65536 << 16;的时候显示一些警告提示,而另一些编译器可能没有,无论如何我们必须在编写代码的时候足够小心,避免上面情况的发生。

20230108173807

作为一个新的整型long long,C++标准必须为它配套地加入整型的大小限制。在头文件中增加了以下宏,分别代表long long的最大值和最小值以及unsigned long long的最大值

#define LLONG_MAX 9223372036854775807LL // long long的最大值
#define LLONG_MIN (-9223372036854775807LL - 1) // long long的最小值
#define ULLONG_MAX 0xffffffffffffffffULL // unsigned longlong的最大值

在C++中应该尽量少使用宏,用模板取而代之是明智的选择。C++标准中对标准库头文件做了扩展,特化了long long和unsigned long long版本的numeric_ limits类模板。这使我们能够更便捷地获取这些类型的最大值和最小值,如下面的代码示例:

#include <iostream>
#include <climits>
#include <limits>
#include <cstdio>

using namespace std;

void func1()
{
    long long x1 = 65536 << 16;
    cout << "x1=" << x1 << endl;

    long long x2 = 65536LL << 16;
    cout << "x2=" << x2 << endl;
}

void func2()
{
    // 使用宏方法
    cout << "LLONG_MAX=" << LLONG_MAX << endl;
    cout << "LLONG_MIN=" << LLONG_MIN << endl;
    cout << "ULLONG_MAX=" << ULONG_LONG_MAX << endl;

    // 使用类模板方法
    cout << "std::numeric_limits<long long>::max()=" << std::numeric_limits<long long>::max() << endl;
    cout << "std::numeric_limits<long long>::min()=" << std::numeric_limits<long long>::min() << endl;
    cout << "std::numeric_limits<unsigned long long>::max=" << std::numeric_limits<unsigned long long>::max() << endl;

    // 使用printf打印输出
    printf("LLONG_MAX=%lld\n", LLONG_MAX);
    printf("LLONG_MIN=%lld\n", LLONG_MIN);
    printf("ULLONG_MAX=%llu\n", ULLONG_MAX);
}

int main(int, char **)
{
    // func1();
    func2();
}

输出结果如下:

LLONG_MAX=9223372036854775807
LLONG_MIN=-9223372036854775808
ULLONG_MAX=18446744073709551615
std::numeric_limits<long long>::max()=9223372036854775807
std::numeric_limits<long long>::min()=-9223372036854775808
std::numeric_limits<unsigned long long>::max=18446744073709551615
LLONG_MAX=9223372036854775807
LLONG_MIN=-9223372036854775808
ULLONG_MAX=18446744073709551615

随着整型long long的加入,std::printf也加入了对其格式化打印的能力。新增的长度指示符ll可以用来指明变量是一个long long类型,所以我们分别使用%lld和%llu来格式化有符号和无符号的long long整型了。当然,使用C++标准的流输入/输出是一个更好的选择。

二、新字符类型 char16_t 和 char32_t

Unicode字符集有UTF-8、UTF-16和UTF-32这3种编码方法。

对于UTF-8编码方法而言,普通类型似乎是无法满足需求的,毕竟普通类型无法表达变长的内存空间。所以一般情况下我们直接使用基本类型char进行处理,而过去也没有一个针对UTF-16和UTF-32的字符类型。到了C++11,char16_t和char32_t的出现打破了这个尴尬的局面。在C++11标准中添加两种新的字符类型char16_t和char32_t,它们分别用来对应Unicode字符集的UTF-16和UTF-32两种编码方法。除此之外,C++11标准还为3种编码提供了新前缀用于声明3种编码字符和字符串的字面量,它们分别是UTF-8的前缀u8、UTF-16的前缀u和UTF-32的前缀U:

char utf8c = u8'a'; // C++17标准
//char utf8c = u8'好';
char16_t utf16c = u'好';
char32_t utf32c = U'好';
char utf8[] = u8"你好世界";
char16_t utf16[] = u"你好世界";
char32_t utf32[] = U"你好世界";

在上面的代码中,分别使用UTF-8、UTF-16和UTF-32编码的字符和字符串对变量进行了初始化,代码很简单,不过还是有两个地方值得一提。

char utf8c = u8’a’在C++11标准中实际上是无法编译成功的,因为在C++11标准中u8只能作为字符串字面量的前缀,而无法作为字符的前缀。这个问题直到C++17标准才得以解决,所以上述代码需要C++17的环境来执行编译。

char utf8c = u8’好’是无法通过编译的,因为存储“好”需要3字节,显然utf8c只能存储1字节,所以会编译失败。

三、char8_t 字符类型

使用char类型来处理UTF-8字符虽然可行,但是也会带来一些困扰,比如当库函数需要同时处理多种字符时必须采用不同的函数名称以区分普通字符和UTF-8字符。C++20标准新引入的类型char8_t可以解决以上问题,它可以代替char作为UTF-8的字符类型。char8_t具有和unsigned char相同的符号属性、存储大小、对齐方式以及整数转换等级。引入char8_t类型后,在C++17环境下可以编译的UTF-8字符相关的代码会出现问题,例如:

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';

参考文献:《现代C++语言核心特性解析》

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

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

相关文章

vue3包依赖关系

包reactivity &#xff1a;响应式API&#xff0c;例如toRef、reactive、Effect、computed、watch等&#xff0c;可作为与框架无关的包&#xff0c;独立构建runtime-core&#xff1a;平台无关的运行时核心代码。包括虚拟dom渲染、组件实现和JavaScript API。可以使用这个包针对特…

机器学习实战教程(十一):线性回归基础篇

一、前言前面的文章介绍了很多分类算法&#xff0c;分类的目标变量是标称型数据&#xff0c;而本文将会对连续型的数据做出预测。主要讲解简单的线性回归和局部加权线性回归&#xff0c;并通过预测鲍鱼年龄的实例进行实战演练。二、什么是回归&#xff1f;回归的目的是预测数值…

Java学习笔记——继承(下)

目录继承中构造方法的访问特点构造方法的访问特点-父类没有空参构造方法代码优化和内存图解xx信息管理系统-集成改进抽象类入门抽象类的注意事项模板设计模式final关键字xx信息管理系统——抽象类改进代码块xx信息管理系统-代码块改进继承中构造方法的访问特点 子类再初始化之…

汽车电子行业入门指南「2022年国内主要新能源车销量」

汽车电子行业入门指南 雪云飞星 2022年国内主要新能源车销量 2022年汽车行业内的人们可谓是经历了很多&#xff1a;4月上海疫情、华为携问界的强势入局、年底取消新能源免购置税等等。对于博主而言也算人生一个小阶段&#xff0c;年底离开了曾经奋斗的某为&#xff0c;翻开了…

序列傅里叶变换

序列傅里叶变换定义 序列傅里叶变换 (DFT) 是一种数学变换&#xff0c;它将一个有限长度的序列转换为其频谱表示。它使用一个复数数组表示序列的频谱&#xff0c;其中每个元素表示对应的频率成分的幅度和相位。 DFT 的公式为&#xff1a; X[k] ∑n0 to N-1 x[n] * e^(-j2πkn/…

Unreal UCLASS常用的类标记宏

BlueprintType,使当前类可以作为蓝图中的类型使用。新建一个继承UObject的C类CustomObject:UObject默认是无法作为蓝图中的类型使用的,打开关卡蓝图,声明一个CustomObject变量:可以看到,这里无法声明CustomObject类型的变量,我们为CustomObject添加BlueprintType标记宏:这样我们…

我的2022,为什么要跳出舒适圈?

1前言今天的冬日暖阳高照&#xff0c;给我羽绒服下的肉身火一般的燥热&#xff0c;给了我一个错觉&#xff0c;以为到了阳春三月。刚刚送完老妈还有老婆孩子回老家&#xff0c;我坐到电脑机器前&#xff0c;准备捋一下思绪&#xff0c;回首2022的生活和工作。 2 2022 回顾今年用…

从零开始搭建Dubbo环境并整合Dubbo+SpringBoot

Windows环境搭建 1. 安装Zookeeper 下载 zookeeper3.5 下载地址 https://zookeeper.apache.org/releases.html#download 下载完成以后, 解压到一个目录下 然后把 zoo_sample.cfg 复制一份, 重命名为 zoo.cfg 修改配置文件 zoo.cfg 中的 dataDir 这个配置 修改为 dataDir../z…

pygame - 图片移动优化 - 引入面向对象思想

目录 一、基本框架 二、代码段 1、附注释 2、无注释 三、效果展示 备注&#xff1a;pygame - 图片移动优化中未对属性和方法进行封装&#xff0c;本篇文章将引入面向对象思想 一、基本框架 import sys import time import pygamepygame.init()SCREEN_WIDTH 680 SCREEN…

基于机器学习预测销售门店的商品销量详细教程

项目概述: 使用时间序列预测来预测来Corporacin Favorita 的数据的商店销售额。 具体来说,构建一个模型来更准确地预测在不同 Favorita 商店销售的数千种商品的单位销售额。您将使用包含日期、商店和商品信息、促销和单位销售的易于理解的训练数据集来练习您的机器学习技能。…

【debug日记】安装包后还是有下划线可以运行、gensim包的安装及版本不同引起的参数不匹配问题

文章目录gensim包版本不同引起的参数不匹配问题安装gensim包后还是有下划线可以运行gensim包的安装问题今天的debug历程可谓一步一个坑。首先我去github上下载了一个项目&#xff0c;关于graph embedding https://github.com/shenweichen/GraphEmbedding 我下载下来直接运行&a…

软件测试 -- 进阶 10 常见软件测试类型

业精于勤&#xff0c;荒于嬉&#xff1b;行成于思&#xff0c;毁于随。-- 韩愈 释译&#xff1a;学业因勤奋而专精&#xff0c;因玩乐而荒废&#xff1b;德行因独立思考而有所成就&#xff0c;因因循随俗而败坏。 是否执行程序/测试执行方法 - 静态测试 - 动态测试 …

如何简单的做量化交易

介绍 首先我不是量化工程师&#xff0c;我只是个后端工程师&#xff1b;其次我对量化也不感兴趣&#xff0c;自己有几把刷子还是了解的&#xff0c;自己不适合做量化交易&#xff1a; 自己没有优秀的模型设计能力自己是个长线投资&#xff0c;一般一个股票都是至少拿一年以上…

【五】Netty 传输Java对象

Netty 传输Java对象介绍业务场景模拟流程图代码展示订购采购消息 POJO 类订购应答消息 POJO 类服务端启动类 SubscribeReqServer服务端业务处理类 SubscribeServerHandler客户端启动类 SubscribeClient客户端 业务处理类 SubscribeClientHandler效果展示服务端打印客户端打印总…

20230109网安陈之琳材料大纲-web渗透

目录 引言 正文 信息收集 端口扫描 敏感目录的扫描 主机漏洞扫描 常见的漏洞及防御 SQL注入漏洞 目录遍历漏洞/文件包含漏洞 提权 删日志 引言 首先呢&#xff0c;经过我本人对此篇论文的研读&#xff0c;发现此篇论文属于web方向的一篇入门文章 梁本来前辈对常见…

使用Docker Compose一键部署前后端分离项目

目录 一、安装Docker和docker Compose &#xff08;1&#xff09;Docker安装 &#xff08;2&#xff09;Docker Compose安装 &#xff08;3&#xff09;查看版本信息 二、准备工作 1. 新建工作目录 2. 工作目录结构 3. 后台打包 4. 前台打包 5. 数据库文件上传 6. 编…

Nginx反向代理和负载均衡配置

一.什么是反向代理 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受Internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服务器上得到的结果返回给Internet上请求连接的客户端&#xff0c;此时代理服务器对外就…

Sentinel-限流 冷启动

概述 当流量突然增大的时候&#xff0c;我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态&#xff0c;我们希望处理请求的数量是缓步的增多&#xff0c;经过预期的时间以后&#xff0c;到达系统处理请求个数的最大值。Warm U…

在Mac上配置Vue开发环境

因为Vue是NodeJS的模块&#xff0c;要想使用Vue需要先安装NodeJS 在Mac中安装NodeJS通过brew包管理器就会很方便, 因为访问源速度问题建议使用5&#xff08;阿里&#xff09;&#xff0c;Homebrew开源项目地址&#xff1a;https://gitee.com/cunkai/HomebrewCN/blob/master/REA…

千锋教育+计算机四级网络-计算机网络学习-02

目录 分组交换的两种传输方式 数据报方式 ​编辑 虚电路方式 OSI参考模型 IP地址分类 公有IP 私有IP 回环ip地址 子网掩码 端口 端口号 端口分类 数据包的组装、拆解 网络应用程序开发流程 选择合适的协议&#xff08;TCP或UDP) TCP—面向连接 UDP—面向无连接 …