C++ 之基本数据类型(整型、布尔型及字符型)

news2024/11/24 7:04:11

文章目录

  • 参考
  • 描述
  • 数据类型
  • 整形
      • 有符号
      • 无符号
      • 规则
      • sizeof 运算符
      • 进制
          • cout 的自动转换(进制)
      • 后缀
          • 验证
          • 溢出
          • 主动权
  • 溢出
  • 布尔型
      • 变量
      • 判断结果
  • 字符型
      • ASCII
      • 细节
      • 范围

参考

项目描述
菜鸟教程数据类型
搜索引擎Google
C++ Primer Plus (第六版)中文版史蒂芬·普拉达 / 张海龙,袁国忠 译
黑马程序员C++

描述

项目描述
操作系统Windows 10 专业版
编辑器VScode
g++8.1.0

数据类型

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。
您可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。


上述内容引用自 菜鸟教程

整形

有符号

有符号整型能够存储负数。

项目大小范围数量级
short、signed short、short int 、signed short int两个字节-32,728 ~ 32,727
int、signed四个字节-2,147,483,648 ~ 2,147,483,647十亿
long、signed long、long int、signed long intWindows 占用四个字节;Linux32 位 系统占用四个字节,64 位 系统占用八个字节-2,147,483,648 ~ 2,147,483,647十亿
long long、signed long long、long long int、singned long long int八个字节-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807百亿亿

注:

  1. 有符号整型中的各个类型均存在别名,你可以使用某一种类型的所有名称中的其中一种来表示该类型。
  2. 有符号整型需要使用一个位(最小的存储单位,在二进制系统中仅能存储一个一或一个零)来表示存储的数值的类型为负数还是非负数。因此,在占用相同内存的情况下,使用有符号数据类型所能表示的最大数值(绝对值)要比无符号数据类型所能表示的最大数值(绝对值)要小。

符号位

  1. 有符号整型可以存储负数,但这也导致了能够存储的正数的数值范围的减小。所以,请权衡数据类型的内存占用量及该类型所能够表示的整数范围来选择合适的数据类型。

无符号

无符号整型仅能存储正数及零。

项目大小范围数量级
unsigned short、unsigned short int两个字节0 ~ 65,535十万
unsigned、unsigned int四个字节0 ~ 4,294,967,295十亿
unsigned long、unsigned long intWindows 占用四个字节;Linux32 位 系统占用四个字节,64 位 系统占用八个字节0 ~ 4,294,967,295十亿
unsigned long long、unsigned long long int八个字节0 ~ 18,446,744,073,709,551,615千亿亿

规则

在不同的 C++ 实现中,不同的数据类型所占用的内存空间是不同的,这可能会导致混乱。C++ 提供了一种灵活的标准(借鉴于 C 语言),该标准确保了不同数据类型所占用的最小内存空间:

  1. short 数据类型所占据的内存空间至少为 两个字节
  2. int 至少与 short 数据类型所占据的内存空间相同。
  3. long 数据类型所占据的内存空间至少为 四个字节,且至少与 int 数据类型所占据的内存空间相同。
  4. long long 数据类型至少为 八个字节,且至少与 long 数据类型所占据的内存空间相同。

sizeof 运算符

使用 sizeof 运算符你可以获取当前 C++ 实现下,某个数据类型或变量所占用的内存空间(以字节为单位)。

举个栗子

// 导入 C++ 标准库 iostream 以实现输入输出功能
#include <iostream>
// 使用标准命名空间
using namespace std;

int main(){
    // 定义变量
    short short_num;
    int int_num;
    // 将变量或数据类型所占用的内存空间进行打印
    cout << "short\t" << sizeof(short_num)<< endl;
    cout << "int\t" << sizeof int_num << endl;
    cout << "long\t" << sizeof(long) << endl;
    cout << "long long\t" << sizeof(long long) << endl;
    // 禁止执行窗口自动关闭以观察程序的输出结果
    system("pause");
}

执行结果

short   2
int     4
long    4
long long       8
请按任意键继续. . .

注:

使用 sizeof 运算符检测当前 C++ 实现下某个变量所占用的内存空间时,可以使用 sizeof 的函数形式或关键字形式。而使用 sizeof 运算符检测当前 C++ 实现下某个数据类型所占用的内存空间时,仅能使用 sizeof 的函数形式,否则你将观察到错误信息。

进制

C++ 允许你使用三种方式来表示整数。具体如下:

  1. 若数值之前存在 0 ,则该整数将被视为八进制数值。
  2. 若数值之前存在 0X0x,则该整数将被视为十六进制数值。
  3. 除上述情况外的其他整数都将被视为十进制数值。

举个栗子

#include <iostream>
using namespace std;


int main() {
    // 八进制数值
    cout << 036 << endl;
    // 十进制数值
    cout << 36 << endl;
    // 十六进制数值
    cout << 0X36 << endl;
    system("pause");
}

执行结果

30
36
54
请按任意键继续. . .

注:

  1. 在八进制数值中,数值的每一位仅允许是 0 ~ 7 范围中的数值。例如 0982 就是一个错误的八进制数值。
  2. 在十六进制数值中,数值的每一位仅允许是 0 ~ 9a ~ fA ~ F 范围中的数值。例如,0X89D 就是一个错误的十六进制数值。
  3. 在十进制中,数值的每一位仅允许是 0 ~ 9 范围中的数值。例如,10a 就是一个错误的十进制数值。
cout 的自动转换(进制)

在上一个示例中,我们虽使用了其他进制(非十进制)的数值,但在使用 cout 关键字将其输出到执行窗口中后,观察到的内容却为其他进制转换为十进制后的结果。

如果你希望 cout 将数值转换指定进制的数值后在执行窗口中输出,那么你可以使用 hexdecoct 关键字用以将数值分别转换为十六进制、十进制及八进制数值后在执行窗口中输出。

举个栗子

#include <iostream>
using namespace std;

int main() {
    cout << oct;
    cout << "八进制数值\t" << 36 << endl;
    cout << dec;
    cout << "十进制数值\t" << 36 << endl;
    cout << hex;
    cout << "十六进制数值\t" << 36 << endl;
    system("pause");
}

执行效果

八进制数值      44
十进制数值      36
十六进制数值    24
请按任意键继续. . .

注:

  1. 使用 cout << oct; 等语句时并不会真的输出什么内容,该类语句可以将后续语句中的 cout 语句中的数值转换为指定的进制后在执行窗口中显示 。

举个栗子

#include <iostream>
using namespace std;

int main() {
    cout << dec;
    cout << "十进制数值\t" << 36 << endl;
    cout << oct;
    cout << "八进制数值\t" << 36 << endl;
    cout << "八进制数值\t" << 36 << endl;
    system("pause");
}

执行效果

十进制数值      36
八进制数值      44
八进制数值      44
请按任意键继续. . .
  1. 你也可以将 oct 等关键字添加到需要发生进制转换的 cout 语句中,但这样做也任将影响到后续的 cout 语句。

举个栗子

#include <iostream>
using namespace std;

int main() {
    cout << hex;
    cout << "十进制数值\t" << 36 << endl;
    cout << oct << "八进制数值\t" << 36 << endl;
    cout << "八进制数值\t" << 36 << endl;
    system("pause");
}

执行效果

十进制数值      24
八进制数值      44
八进制数值      44
请按任意键继续. . .

后缀

验证

在计算机科学中,字面量 是用于表达源代码中一个固定值的表示法。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。


上述内容引用自 百度百科

C++ 中,并不是只有变量有其数据类型,字面量也是有其数据类型的。整型字面量使用的默认数据类型为 int,我们可以通过如下代码进行验证。

#include <iostream>
using namespace std;

int main(){
    cout << sizeof 12 << endl;
    system("pause");
}

执行结果

4
请按任意键继续. . .
溢出

在字面量数值的大小超出了 int 所能表示的范围时,C++ 将从其它整型数据类型中选择尽可能小且合适的数据类型作为该整型字面量的数据类型。但十进制和非十进制数值的字面量可选择的数据类型存在不同,非十进制数值字面量可以选择无符号整型相关的数据类型,而十进制数值字面量仅能使用有符号整型相关的数据类型。

举个栗子

#include <iostream>
using namespace std;

int main() {
    // 2200000000(即 22 亿)
    // 超出了 int 所能表示的数值范围
    cout << sizeof 2200000000 << endl;
    // 十六进制数值 83215600 转换为十进制
    // 数值为 2200000000
    cout << sizeof 0X83215600 << endl;
    system("pause");
}

执行结果

8
4
请按任意键继续. . .

分析

  1. 由于 2200000000(即 22 亿) 超出了 int 及 long 所能支持的最大数值且该数值为十进制数值,所以使用 long long 作为该整型字面量的数据类型。

  2. 由于 0X83215600(即 22 亿) 超出了 int 及 long 所能支持的最大数值且该数值为十六进制数值,所以使用 unsigned int 作为该整型字面量的数据类型。

主动权

除了让 C++ 为整型字面量分配合适的数据类型外,我们也可以通过在字面量中添加后缀来指定该字面量使用的数据类型。C++ 支持的整型数据类型的后缀有:

项目后缀
longlL
unsigned longulul 的顺序可以发生变换且两者的大小写形式不被限制)
long longllLL
unsigned long longullUlluLLULL

注:

在使用后缀规定字面量的数据类型时,请检查数值是否在该数据类型所支持的范围内,否者 C++ 将抛出错误。

举个栗子

#include <iostream>
using namespace std;

int main() {
    cout << sizeof 22Ul<< endl;
    cout << sizeof 22LL << endl;
    system("pause");
}

执行结果

4
8
请按任意键继续. . .

溢出

在某一数据类型的变量存储的值的大小超出了该数据类型所支持的范围时,变量值将跳转到范围的另一端并在次基础上继续计算。

举个栗子

#include <iostream>
using namespace std;

int main() {
    // 无符号 short 数据类型所支持的最大值
    short span_max = 32767;
    // 无符号 short 数据类型所支持的最小值
    short span_min = -32768; 
    span_max += 7;
    span_min -= 10;
    cout << span_max << endl;
    cout << span_min << endl;
    system("pause");
}

执行结果

-32762
32758
请按任意键继续. . .

布尔型

ANSI/ISO C++ 标准开始支持 布尔类型布尔 这个名称来源于英国数学家 George Boole ,是他开发了逻辑率的数学表示法。在计算中,布尔变量的值可以是 truefalse ,分别代表了

拓展

  1. C99 之前,C语言 的标准没有提供布尔类型,但是这不意味着 C90 不能表示布尔值的概念。C 中的所有布尔运算 (&&, ||) 以及条件声明 (if, while) 都以非零值代表真,零值代表假。
  2. C++ 支持布尔类型前,C++C 一般,将 0 解释为 false,将 非 0 值 解释为 true。但在 C++ 支持布尔类型后,你也仍可以使用 0 来代替 false 或是使用 非 0 值 来代替 true 在条件语句发挥作用。

变量

C++ 中,关键字 truefalse 分别可以看作是存储了 10 的变量。

举个栗子

#include <iostream>
using namespace std;

int main() {
    cout << true << endl;
    cout << false << endl;
    system("pause");
}

执行结果

1
0
请按任意键继续. . .

判断结果

布尔类型通常作为判断一个表达式是否正确的结果,若表达式正确则布尔运算的结果为 true ,若表达式错误则布尔运算的结果为 false

举个栗子

#include <iostream>
using namespace std;

int main() {
    bool result = 3 < 1;
    // 括号用于提升表达式的优先级,
    // 防止 > 号被 cout 关键字误解。
    cout << (3 > 1) << endl;
    cout << result << endl;
    system("pause");
}

执行结果

1
0
请按任意键继续. . .

字符型

C++ 中,字符型变量用于存储数值及 ASCII 码。你可以使用 char 关键字声明一个字符型变量,使用 char 关键字创建的变量将占用一个字节的内存空间。

注:

  1. 字符需要使用单引号包裹,若使用双引号,C++ 将抛出错误。
  2. 字符型变量仅能包含单个字符,但转移字符除外,因为转义字符需要使用两个字符来表示一个转义字符。例如:\n\t

ASCII

ASCII 表(一)

ASCII 码表(二)

细节

C++ 中,使用 char 类型的变量存储某一字符时,存储的不是字符本身而是该字符对应的编码值。我们可以通过如下代码对此进行验证:

#include <iostream>
using namespace std;

int main() {
    char letter = 'a';
    letter = letter + 1;
    cout << letter << endl;
    system("pause");
}

执行效果

b
请按任意键继续. . .

分析

在使用关键字 char 创建字符型变量 letter 后,我们对 letter 自身进行了加一的操作。在将 letter 输出到执行窗口后,我们观察到的是 b 而不是 a
这是由于我们将 a 对应的 ASCII 码存入了变量 letter 中,我们对其进行加一操作,导致存储的 ASCII 码发生了变化,最终打印出了其他字符。

注:

  1. cincout 在面对字符串类型数据时将进行特殊的处理,具体如下:

    • cin 将输入的字符转换为其对应的 ASCII 码值。
    • coutchar 变量中保存的 ASCII 码转换为其对应的字符并将其输出到执行窗口中。
  2. 除了传递字符给 char 变量外,你还可以直接将需要保存的字符对应的 ASCII 码传递给该变量。例如:

#include <iostream>
using namespace std;

int main() {
    char letter = 65;
    cout << letter << endl;
    system("pause");
}

执行结果

A
请按任意键继续. . .

范围

char 在默认情况下是否为有符号数据类型由 C++ 实现来决定,这样编译器的开发人员将能够最大限度地将这种类型与硬件属性匹配起来。你可以使用 signed charunsigned char 来显式指定 char 为哪一种类型。
如果将 char 用作数值类型,则 unsigned charsigned char 之间的差异将变得非常重要。unsigned char 类型所支持的范围为 0 ~ 255 ,而 signed char 类型所支持的范围为 -128 ~ 127

举个栗子

#include <iostream>
using namespace std;

int main() {
    unsigned char letter = 130;
    cout << letter << endl;
    cout << "--------------------" << endl;
    cout << (int)letter << endl;
    system("pause");
}

执行效果


--------------------
130
请按任意键继续. . .

注:

  1. cout 语句仅能将存储的数值为 0 ~ 127char 变量转化为该数值对应的字符。

  2. (int) 语句可以将其他类型的数据转换为 int 类型的数据。

  3. 请尽可能使用 unsigned charsigned char 来显式指定 char 的类型,否则你无法判断运行程序后是否会出现如下状况:

#include <iostream>
using namespace std;

int main() {
    char letter = 130;
    cout << letter << endl;
    cout << "--------------------" << endl;
    cout << (int)letter << endl;
    system("pause");
}

执行结果


--------------------
-126
请按任意键继续. . .

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

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

相关文章

深度学习目标检测_YOLOV4超详细解读

文章目录一. 前言yolov4的创新点2.1 输入端的创新2.1.1数据增强2.1.2自对抗训练&#xff08;SAT&#xff09;2.2BackBone创新Dropblock标签平滑损失函数IOU LossGIOU LossDIOU LossCIOU Loss一. 前言 作者AlexeyAB大神&#xff01; YOLOv4 拥有43.5%mAP65FPS &#xff0c;达到…

C语言(利用函数将字符串转换为数字和数子转换字符串)

目录 1.atoi(字符串转换为int类型) 2.atof(字符串转换为float类型) 3.atol(字符串转换为long类型) 4.strtol(字符串转换为long类型,但可以选择转换的进制&#xff0c;以及标记结束字符地址) 5.strtod(字符串转换为double类型,可以标记结束字符地址) 6.整数和浮点数转换为…

项目进度经常超时怎么办?项目经理如何有效管理项

当项目延期&#xff0c;我们要先找根因&#xff0c;再根据根因制定具体针对性措施。如果是故障&#xff0c;第一时间是以修复问题为主&#xff0c;然后去找原因&#xff0c;最终给出对应的措施。 对于项目进度&#xff0c;那首先要去了解延期的原因&#xff0c;是计划制定的不…

vite 项目切换不同依赖项的分支,运行加载缓慢问题的解决方案(Pre-bundling dependencies)

前言 当我们在首次使用 yarn dev 命令启动 vite 时&#xff0c;或者 切换分支&#xff0c;依赖项发生变化时 会发现项目启动时相当的慢&#xff0c;大概要十几分钟&#xff0c;而且控制台终端打印了如下信息&#xff1a; Pre-bundling dependencies: this will be run only …

vivo官网App模块化开发方案-ModularDevTool

作者&#xff1a;vivo 互联网客户端团队- Wang Zhenyu 本文主要讲述了Android客户端模块化开发的痛点及解决方案&#xff0c;详细讲解了方案的实现思路和具体实现方法。 说明&#xff1a;本工具基于vivo互联网客户端团队内部开源的编译管理工具开发。 一、背景 现在客户端的业…

【Jqgrid分页勾选保存】三步实现表格分页勾选(取消勾选)保存(附源码)

目录1、创建临时存储数组&#xff0c;初始化赋值2、单行选中与取消&#xff0c;调整数组3、全选与取消全选&#xff0c;调整数组4、输出数组保存5、片尾彩蛋【写在前面】表格可以说是在我们的web页面中是最常见的&#xff0c;之前我们介绍过layui表格翻页勾选的实现过程&#x…

到2030年,边缘计算潜在市场将增长至4450亿美元!

国际电信咨询公司STL Partners近日出了一份边缘计算关键数据统计&#xff0c;重点介绍了九项边缘计算统计数据&#xff0c;边小缘着手翻译了一下这些数据&#xff0c;这些数据预测显示了边缘计算市场的增长潜力&#xff0c;以及边缘部署数量最多的垂直行业和地区。1.到2030年&a…

java Spring aop入门准备工作

首先 Spring 框架一般都是基于 Aspect]实现 AOP 操作 然后就会带出问题 什么是 Aspect 首先 Aspect并不属于Spring 他是一个单独的AOP框架 离开Spring他也能单独运行 但在Spring开发中 我们常用他来配合Spring完成AOP操作 所以说 我们是要 基于Aspect去配合Spring完成AOP操作…

压力应变电桥信号隔离放大变送器差分输入0-±10mV/0-±20mV转0-20mA/0-10v

概述&#xff1a;DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入…

ChatGPT入门案例|商务智能对话客服(二)

ChatGPT是人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;拥有语言理解和文本生成能力&#xff0c;尤其是它会通过连接…

day41【代码随想录】动态规划之01背包问题

文章目录前言 01背包一、二维dp数组01背包1.1 确定dp数组以及下标的含义1.2 确定递推公式1.3 初始化1.4 遍历顺序1.5推导dp数组1.6 完整代码二、一维dp数组01背包&#xff08;滚动数组&#xff09;2.1 确定dp数组以及下标的含义2.2 确定递推公式2.3 初始化2.4 遍历顺序&#xf…

移动应用开发环境搭建Andriod Studio

文章目录提示&#xff1a;虚拟化的开启零 java环境准备一 下载和安装Android Studio1.1 默认方式安装操作1.2 自定义安装方式1.3 StartService 失败问题解决二 第一个程序2.1 创建一个新项目2.2 下载和创建模拟器2.3 启动模拟器2.4 运行提示&#xff1a;虚拟化的开启 记得提前…

大神之路-起始篇 | 第17章.计算机科学导论之【计算理论】学习笔记

欢迎关注「全栈工程师修炼指南」公众号点击 &#x1f447; 下方卡片 即可关注我哟!设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01;涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识“ 花开堪折直须折&#xff0c;莫待无花空折…

2023年浙江水利水电施工安全员精选真题题库及答案

百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…

#459 津津有味:北方人对饺子的痴迷可能是刻进骨子里的

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 卷圈 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 产品统筹 / bobo 录音间 / 声湃轩活着不端饺子碗&#xff0c;哭天抹泪没人管。你一定见识过铺天盖地的对“北方人一过节就吃饺子”的调侃。但饺子就是很好吃这件事&am…

ARM uboot 源码分析4 -启动第二阶段

一、start_armboot 函数简介 1、一个很长的函数 (1) 这个函数在 uboot/lib_arm/board.c 的第 444 行开始到 908 行结束。 (2) 450 行还不是全部&#xff0c;因为里面还调用了别的函数。 (3)为什么这么长的函数&#xff0c;怎么不分成两三个函数&#xff1f;主要因为这个函数…

100种思维模型之非sr思维模型-012

什么是sr? sr是stimulus-response的缩写&#xff0c;意思是刺激反应。 那么非sr思维模型就是非刺激反应思维模型的意思。 今天我们来聊聊非sr思维模型——一个提醒我们思考&#xff0c;提醒我们任何时刻都有选择权的思维模型。 本文依然从三个方面进行介绍&#xff0c;何谓…

你是真的“C”——详解结构体知识点

你是真的“C”——详解结构体知识点&#x1f60e;前言&#x1f64c;什么是结构体&#xff1f;&#x1f64c;1. 结构体的声明&#x1f64c;1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2. 结构体成员的访问&#x1f64c;3结构体传参&#x…

推荐领域新人必看书籍:《推荐系统实践》

这本书非常适合推荐领域的新手&#xff0c;因为这本书的主要目的更接近于科普&#xff0c;而不是描述具体的推荐算法。什么是推荐系统&#xff1f;如果有一位你喜欢的女士约你一起外出&#xff0c;肯定不需要别人推荐你是否赴约吧&#xff01;&#xff08;信息量太小则不需要被…

VS Code中的GIT操作

一、前言 我们在进行项目开发时都免不了与GIT打交道&#xff0c;但是面对各种的难记的GIT命令总是手足无措&#xff1b;还好编译器中内置了GIT的仓库的一系列操作&#xff0c;掌握了可视化的操作就不用担心记不住GIT命令符了。下面主要介绍VS Code中具体的操作&#xff1a; 二…