「C++系列」C++ 数据类型

文章目录

  • 一、C++ 数据类型
  • 二、C++ 数据类型占位与范围
  • 三、类型转换
    • 1. 隐式类型转换(Automatic Type Conversion)
    • 2. 显式类型转换(Explicit Type Conversion)
    • 3. 示例代码
  • 四、数据类型案例
    • 1. 整型
    • 2. 浮点型
    • 3. 字符型
    • 4. 布尔型
    • 5. 枚举类型
    • 6. 指针类型
    • 7. 引用类型
  • 五、相关链接

在这里插入图片描述

一、C++ 数据类型

C++ 数据类型定义了存储在变量中的数据的种类,不同的数据类型决定了数据在内存中的存储方式,以及它们可以执行的操作。以下是C++中的基本数据类型:

  1. 整型(Integer Types)
  • int:有符号整数类型,根据编译器和系统架构的不同,其大小通常为16位、32位或64位。
  • short:有符号短整型,通常比int小。
  • long:有符号长整型,通常比int大。
  • long long:有符号长长整型,比long更大。
  • 无符号整型:每种整型都有对应的无符号版本(例如unsigned intunsigned shortunsigned longunsigned long long),它们只能存储非负整数。
  1. 浮点型(Floating-Point Types)
  • float:单精度浮点型,用于存储带小数点的数,通常占用4个字节。
  • double:双精度浮点型,比float具有更高的精度和更大的范围,通常占用8个字节。
  • long double:长双精度浮点型,比double具有更高的精度。
  1. 字符型(Character Types)
  • char:字符型,用于存储单个字符(如字母、数字、标点符号等)。实际上,char是整型的一种特殊形式,可以参与整数运算。字符类型有charsigned charunsigned char之分,具体有无符号由编译器决定。
  1. 布尔型(Boolean Type)
  • bool:布尔型只有两个值:truefalse,常用于条件判断和逻辑运算。在C++中,布尔类型会被自动转换为整型,其中true对应的整数值为1,false对应的整数值为0。
  1. 宽字符型(Wide Character Type)
  • wchar_t:用于存储宽字符(如Unicode字符)。
  1. 枚举类型(Enumeration Types)
  • 枚举类型是一种用户定义的数据类型,允许为整数常量指定一个名称,使代码更易于阅读和维护。例如:enum Color { RED, GREEN, BLUE };
  1. 指针类型(Pointer Types)
  • 指针类型是一种特殊的数据类型,用于存储内存地址。指针变量可以指向任何类型的内存地址,包括变量、数组、函数等。
  1. 引用类型(Reference Types)
  • 引用是C++中的另一种特殊数据类型,允许为变量创建一个别名。引用在声明时必须初始化,并且一旦初始化,就不能再指向其他变量。

二、C++ 数据类型占位与范围

类型范围
char1 个字节-128 到 127 或者 0 到 255
unsigned char1 个字节0 到 255
signed char1 个字节-128 到 127
int4 个字节-2147483648 到 2147483647
unsigned int4 个字节0 到 4294967295
signed int4 个字节-2147483648 到 2147483647
short int2 个字节-32768 到 32767
unsigned short int2 个字节0 到 65,535
signed short int2 个字节-32768 到 32767
long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int8 个字节0 到 18,446,744,073,709,551,615
float4 个字节精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double8 个字节双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long long8 个字节双精度型占8 个字节(64位)内存空间,表示 -9,223,372,036,854,775,807 到 9,223,372,036,854,775,807 的范围
long double16 个字节长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。
wchar_t2 或 4 个字节1 个宽字符

三、类型转换

在C++中,类型转换(也称为类型强制或类型转换)是将一个数据类型的值转换为另一个数据类型的值的过程。C++支持几种类型的类型转换,包括隐式类型转换(也称为自动类型转换)和显式类型转换(也称为强制类型转换)。

1. 隐式类型转换(Automatic Type Conversion)

隐式类型转换是编译器自动执行的,而无需程序员明确指定。这种转换通常发生在以下情况:

  • 当一个较小的数据类型(如int)被赋值给一个较大的数据类型(如long)时。
  • 当一个整数被赋值给一个浮点类型(如floatdouble)时。
  • 当表达式中涉及到混合类型的操作数时(例如,intdouble相加)。

2. 显式类型转换(Explicit Type Conversion)

显式类型转换需要程序员明确指定。在C++中,有几种显式类型转换的方法:

  1. C风格的类型转换
    使用()来指定要转换的目标类型。例如:
int x = 10;
double y = (double)x; // 将int转换为double
  1. C++风格的类型转换
    C++提供了四种新的类型转换运算符,它们提供了更好的类型安全和可读性。
  • static_cast:用于基本数据类型之间的转换,以及类的向上/向下转型(无危险情况)。
  • dynamic_cast:主要用于类的向上/向下转型,特别是在继承层次结构中。只适用于指向对象的指针或引用。
  • const_cast:用于删除或添加常量性。
  • reinterpret_cast:进行底层的重新解释转换,如指针类型之间的转换。这种转换高度不安全,应谨慎使用。

示例:

int x = 10;
double y = static_cast<double>(x); // 使用static_cast进行转换

3. 示例代码

下面是一个包含各种类型转换的示例代码:

#include <iostream>

class Base {};
class Derived : public Base {};

int main() {
    int a = 10;
    double b = static_cast<double>(a); // 显式类型转换(基本类型)

    Derived* d = new Derived();
    Base* b_ptr = d; // 隐式类型转换(向上转型)
    // Derived* d2 = static_cast<Derived*>(b_ptr); // 显式向上转型是安全的,但这里没有实际必要
    Derived* d2 = dynamic_cast<Derived*>(b_ptr); // 显式向下转型(需要dynamic_cast)

    const int c = 20;
    int* non_const_ptr = const_cast<int*>(&c); // 移除const属性(危险)

    int* int_ptr = reinterpret_cast<int*>(0x1234); // 底层重新解释转换(高度危险)

    std::cout << "a as double: " << b << std::endl;
    std::cout << "d2 points to a Derived object: " << (d2 == d ? "true" : "false") << std::endl;

    // 注意:不要解引用non_const_ptr或依赖int_ptr,因为它们是不安全的

    delete d; // 不要忘记释放内存

    return 0;
}

dynamic_cast在运行时检查转换是否有效,如果转换无效(例如,将指向基类对象的指针向下转型为派生类,而该基类对象实际上并不是派生类的实例),则dynamic_cast会返回空指针(对于指针)或抛出异常(对于引用)。这是dynamic_cast相比static_cast更安全的一个方面。

四、数据类型案例

一些C++数据类型的详细案例代码,涵盖了整型、浮点型、字符型、布尔型、枚举类型、指针类型、引用类型以及用户自定义类型(如结构体和类)。

1. 整型

#include <iostream>

int main() {
    int intVar = 10;
    short shortVar = 20;
    long longVar = 3000000000;
    unsigned int unsignedIntVar = 4294967295U; // 最大的无符号int值(取决于系统)

    std::cout << "intVar: " << intVar << std::endl;
    std::cout << "shortVar: " << shortVar << std::endl;
    std::cout << "longVar: " << longVar << std::endl;
    std::cout << "unsignedIntVar: " << unsignedIntVar << std::endl;

    return 0;
}

2. 浮点型

#include <iostream>

int main() {
    float floatVar = 3.14f;
    double doubleVar = 3.141592653589793238;

    std::cout << "floatVar: " << floatVar << std::endl;
    std::cout << "doubleVar: " << doubleVar << std::endl;

    return 0;
}

3. 字符型

#include <iostream>

int main() {
    char charVar = 'A';
    char anotherCharVar = 65; // ASCII码值,等同于'A'

    std::cout << "charVar: " << charVar << std::endl;
    std::cout << "anotherCharVar: " << anotherCharVar << std::endl;

    return 0;
}

4. 布尔型

#include <iostream>

int main() {
    bool boolVar = true;

    if (boolVar) {
        std::cout << "boolVar is true" << std::endl;
    } else {
        std::cout << "boolVar is false" << std::endl;
    }

    boolVar = false;
    std::cout << "boolVar is now " << (boolVar ? "true" : "false") << std::endl;

    return 0;
}

5. 枚举类型

#include <iostream>

enum Color { RED, GREEN, BLUE };

int main() {
    Color myColor = RED;

    switch (myColor) {
        case RED:
            std::cout << "The color is red." << std::endl;
            break;
        case GREEN:
            std::cout << "The color is green." << std::endl;
            break;
        case BLUE:
            std::cout << "The color is blue." << std::endl;
            break;
        default:
            std::cout << "Unknown color." << std::endl;
    }

    return 0;
}

6. 指针类型

#include <iostream>

int main() {
    int num = 10;
    int* ptr = &num; // ptr指向num的内存地址

    std::cout << "Value of num: " << num << std::endl;
    std::cout << "Address of num: " << &num << std::endl;
    std::cout << "Value of ptr (num's address): " << ptr << std::endl;
    std::cout << "Value pointed by ptr (num's value): " << *ptr << std::endl;

    return 0;
}

7. 引用类型

#include <iostream>

int main() {
    int num = 10;
    int& ref = num; // ref是num的引用

    std::cout << "Value of num: " << num << std::endl;
    std::cout << "Value of ref (same as num): " << ref << std::endl;

    ref = 20; // 修改ref也会修改num
    std::cout << "After modification, value of num: " << num << std::endl;

    return 0;
}

五、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis基础教程(四):redis键(key)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

论文阅读之旋转目标检测ARC:《Adaptive Rotated Convolution for Rotated Object Detection》

论文link&#xff1a;link code&#xff1a;code ARC是一个改进的backbone&#xff0c;相比于ResNet&#xff0c;最后的几层有一些改变。 Introduction ARC自适应地旋转以调整每个输入的条件参数&#xff0c;其中旋转角度由路由函数以数据相关的方式预测。此外&#xff0c;还采…

【PL理论深化】(13) 变量与环境:文法结构 | 真假表达式:isZero E | let 表达式叠放 | 定义的规则 | 条件语句的使用

&#x1f4ac; 写在前面&#xff1a;从现在开始&#xff0c;让我们正式设计和实现编程语言。首先&#xff0c;让我们扩展在之前定义的整数表达式语言&#xff0c;以便可以使用变量和条件表达式。 目录 0x00 文法结构 0x01 真假表达式&#xff1a;isZero E 0x02 let 表达式叠…

Leetcode 78 数组子集

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1…

Python-数据分析组合可视化实例图【附完整源码】

数据分析组合可视化实例图 开篇&#xff1a;应女朋友的要求&#xff0c;于是写下了这篇详细的数据可视化代码及完整注释 一&#xff1a;柱状图、折线图横向组合网格布局 本段代码使用了pyecharts库来创建一个包含多个图表&#xff08;柱状图、折线图&#xff09;和网格布局的…

服装分销的系统架构

背景 服装的分销规则&#xff1a;组织结构由总公司代理商专卖店构成。总公司全权负责销售业务&#xff0c;并决定给代理商的份额&#xff1b;代理商再给货到专卖店&#xff0c;整个组织机构呈现树状结构&#xff1b;上级机构对下级机构拥有控制权&#xff0c;主要控制其销售的服…

利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API

谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro&#xff0c;Gemini 1.5 Pro不仅能够生成创意文本和代码&#xff0c;还能理解、总结上传的图片、视频和音频内容&#xff0c;并且支持高达100万tokens的上下文。在多个基准测试中表现优异&#xff0c;性能超越了ChatGP…

MySQL高阶:事务和并发

事务和并发 1. 事务创建事务 2. 并发和锁定并发问题 3. 事务隔离等级3.1 读取未提交隔离级别3.2 读取已提交隔离级别3.3 重复读取隔离级别3.4 序列化隔离级别 4. 死锁 1. 事务 事务&#xff08;trasaction&#xff09;是完成一个完整事件的一系列SQL语句。这一组SQL语句是一条…

植物大战僵尸融合版2024最新版本登场,绝对能满足你的所有期待!

一开场&#xff0c;就让我们直切主题。各位玩家&#xff0c;是否已对《植物大战僵尸》中的传统植物和僵孠对决失去了新鲜感&#xff1f;是否渴望体验更具创意、更富挑战性的游戏玩法&#xff1f;那么&#xff0c;让我来告诉你&#xff0c;《植物大战僵尸融合版》1新版本的登场&…

AI论文速读 | 2024[KDD]ASeer基于异步时空图卷积网络的不规则交通时间序列预测

题目&#xff1a;Irregular Traffic Time Series Forecasting Based on Asynchronous Spatio-Temporal Graph Convolutional Network 作者&#xff1a;Weijia Zhang, Le Zhang, Jindong Han&#xff08;韩金栋&#xff09;, Hao Liu&#xff08;刘浩&#xff09;, Jingbo Zhou…

纯硬件FOC驱动BLDC

1. 硬件FOC 图 1 为采用 FOC 的方式控制 BLDC 电机的过程&#xff0c;经由 FOC 变换( Clark 与 Park 变换) &#xff0c;将三相电流转换为空间平 行电流 ID 与空间垂直电流 IQ。经过 FOC 逆变化逆( Clark 变换与逆 Park 变换) &#xff0c;将两相电流转换为三相电流用于控 制电…

容器:deque

以下是对于deque容器知识的整理 1、构造 2、赋值 3、大小操作 4、插入 5、删除 6、数据存取 7、排序 #include <iostream> #include <deque> #include <algorithm> using namespace std; /* deque容器&#xff1a;双端数组&#xff0c;可以对头端进行插入删…

网页用事件监听器播放声音

一、什么是监听器&#xff1a; 在前端页面中&#xff0c;事件监听器&#xff08;Event Listener&#xff09;是一种编程机制&#xff0c;它允许开发者指定当特定事件&#xff08;如用户点击按钮、鼠标悬停、页面加载完成等&#xff09;发生时执行特定的代码块。简而言之&#x…

clonezilla(再生龙)克隆物理机linux系统,然后再去另一台电脑安装

前言: 总共需要2个u盘,一个装再生龙系统,一个是使用再生龙把硬盘备份到另一个盘里面,恢复的时候,先使用再生龙引导,然后再插上盘进行复制 1.制作启动u盘 1.1下载再生龙Clonezilla 下載 1.2下载UltraISO(https://cn.ultraiso.net/uiso9_cn.exe) 1.3 打开UltraISO,选择co…

Vue 解决报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制台报了一个错误 , Uncaught SyntaxError: Unexpected identifier ‘Promise’&#xff0c;网上查到的方法是 缺少符号&#xff0c;语法写法错误&#xff0c;但这些都没有解决我的问题&am…

用Lobe Chat部署本地化, 搭建AI聊天机器人

Lobe Chat可以关联多个模型&#xff0c;可以调用外部OpenAI, gemini,通义千问等, 也可以关联内部本地大模型Ollama, 可以当作聊天对话框消息框来集成使用 安装方法参考&#xff1a; https://github.com/lobehub/lobe-chat https://lobehub.com/zh/docs/self-hosting/platform/…

RCE漏洞

RCE&#xff08;Remote code/command execution&#xff09;&#xff0c;远程代码执行和远程命令执行。在很多web应用开发的过程中&#xff0c;程序员可能在代码中编写一些能够运行字符串的函数&#xff0c;当用户可以控制输入内容时&#xff0c;这就导致了RCE漏洞。 1 远程代…

《昇思25天学习打卡营第4天|数据集 Dataset》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 数据集加载2. 数据集迭代3. 数据集常用操作与自定义数据集 前言&#xff1a; 今天学习的是数据集的内容。首先&#xff0c;数据是深度学习的基石&#xff0c;高质量的数据输入能够在整个深度神经网络中发挥积极作用。MindSpo…

安全和加密常识(6)Base64编码方式

文章目录 什么是 Base64编码原理编解码示例应用什么是 Base64 Base64 是一种用于将二进制数据编码为仅包含64种ASCII字符的文本格式的编码方法,注意,它不是加密算法。它设计的目的主要是使二进制数据能够通过只支持文本的传输层(如电子邮件)进行传输。Base64常用于在需要处…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路&#xff0c;可以省略&#xff1b;rst引脚电路&#xff0c;可以省略&#xff0c;boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …