C++初学者4——标准数据类型

先导:

目录

一、整形

二、浮点型

!保留指定小数位数

三、布尔类型

关系运算

逻辑运算

​C++逻辑运算四句口诀​

四、字符型

ASCll码

C++中的字符表示

字符比较

ASCII中的常用转换

大小写转换

转换成0~25

五、数据类型隐式转换

[​1. 隐式转换的通用规则​](#1. 隐式转换的通用规则)

[​2. 隐式转换的优先级​](#2. 隐式转换的优先级)

​示例:算术运算时的隐式转换​

[​3. 整数提升(Integer Promotion)​​](#3. 整数提升(Integer Promotion))

[​4. 算术转换(Arithmetic Conversion)​​](#4. 算术转换(Arithmetic Conversion))


一、整形

我们平常最常见的整形是int ,它占4个字节 , 也就是32比特, 可表示的范围为~,如果是 unsigned int,即没有负数区间,表示范围为~

cpp 复制代码
cout << sizeof(int) << endl << sizeof(1234)

输出:
4
4

如果我们存储的数字范围超过int 了,那么我们就可以使用long long。long long占8个字节

cpp 复制代码
cout << sizeof(123456789123456789) << endl << sizeof(long long);

输出:
8
8

有的时候我们需要把int转换为long long,我们可以将一个数字乘上1LL或者加上后缀ll或LL

cpp 复制代码
cout << sizeof(1234 * 1LL);
输出:
8

在实际编程过程中,如果需要多次使用 long long,我们可以通过typedef 关键字将 long long 重命名为 ll

使用格式:typedef long long ll;

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a;
int main(){
    cin >> a;
    cout << sizeof(a);
    return 0;
}
输出:
8

另外,在C++ primer 是这样规定的:sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long),但是各个数据类型的具体长度,则是由编译器自行决定的。

在我们考试的系统中,short 占 2 个字节,long 占 8 个字节。

二、浮点型

| 名称 | 数据类型 | 字节数 | 数据范围 | 有效位数 |
| 单精度浮点数 | float | 4B | -3.4e38~3.4e38 | 6~7位 |
| 双精度浮点数 | double | 8B | -1.7e308~1.7e308 | 15~16位 |

长双精度浮点数 long double 16B -1.2e4932~1.2e4932 18~19位

float 占 4 字节 ,保留有效位数 7 位 ,double 占 8 字节 ,保留有效位数 16 位 。一般在算法竞赛中,我们都使用 double

其中,浮点型默认为double类型 ,跟long long一样,也可以通过后缀f、F(单精度浮点型)、L(长双精度浮点型)。

cpp 复制代码
cout << sizeof(1.11) << endl;
cout << sizeof(1.11f) << endl;
cout << sizeof(1.11F) << endl;
cout << sizeof(1.11L) << endl;

输出:
8
4
4
16

!保留指定小数位数

注意:

  1. 使用setprecision保留小数位数时,需要引入头文件#include <iomanip>
  2. 必须加 fixed,否则实际输出位数可能会小于指定保留位数。
  3. 以上所有格式化控制符只对紧跟在其后的数据有作用
cpp 复制代码
#include <iostream>
#include <iomanip>
using namespace std;
const double P = 3.1415;
int main(){
    cout << P << endl;
    cout << setprecision(5) << P << endl; //错误示范,此处必须要加fixed
    cout << setprecision(6) << 3.14159265358 << endl;
    cout << fixed << setprecision(3) << P << endl;
    cout << fixed << setprecision(5) << P << endl;
    return 0;
}

输出为:

3.1415
3.1415
3.14159
3.142
3.14150

三、布尔类型

名称 数据类型 字节数 数值范围
布尔 bool 1B true或false

布尔变量声明和赋值

cpp 复制代码
bool a = true, b = false;
bool a, b;
bool a = 0, b = 1;
//注意,同之前的一样,每个变量只能被定义声明一次,这里只是为了方便演示

输出的bool类型,并不会输出true或者false,而是输出1或0,其中,true是1,false是0一个非零数定义成bool的时候为true,但输出是1!!!

cpp 复制代码
cout << bool(0.2) << endl;    //输出:1
bool a = -1, b = 0;
cout << a << " " << b;    //输出:1 0
int c = bool(3), d = false;
cout << c << " " << d << endl;    //输出1 0

关系运算

大小关系 C++关系运算符 数学符号
大于 >
小于 <
大于等于 >=
小于等于 <=
等于 ==
不等于 !=

重点来了:

数值A 关系运算符数值B(表达式的值:布尔值)

什么意思呢?让我们来看几个例子

比如表达式

cpp 复制代码
1 > 2

1显然比2小,所以这个表达式的值为false(否)

cpp 复制代码
(a = 3) == 3

这个式子中,先把a赋值成了3,再判断a是不是等于3,这个结果肯定是true

有一个比较容易判断错的式子:(1 < 2)== false

这个式子的值为false。首先,我们先解析括号中的式子:1<2,这个式子的结果肯定为真,而真与假矛盾了,所以这个式子肯定为假

记住这个四句口诀,轻松搞定多重关系运算符的真假判断:


🎯 口诀速记

  1. 括号优先算(先算括号内)
  2. 比较从左看(同级从左到右)
  3. 赋值返右边=返回赋值结果)
  4. 真值对比干true/false直接比)

🌰 例子秒懂

  • (a=3)==3 (口诀3:赋值返右边,a=3返回3,再比3==3
  • (1<2)==false (口诀1+4:先算1<2true,再比true==false

​**⚡ 避坑提醒**​

  • 小心**赋值= 比较==**别混淆!
  • 遇到<>等比较符,从左到右依次算。

用这口诀,再复杂的表达式也能秒拆解! ✨

逻辑运算

逻辑运算符 含义
&& 逻辑与,如果两个表达式的值都为真,就返回真,否则,就返回假
|| 逻辑或,两个表达式有一个表达式的值为真,就返回真
逻辑非,如果表达式为真,就返回假。表达式为假,就返回真

逻辑运算真值表(1表示表达式的值为真,0表示假):

A B A && B A || B A ! B
1 1 1 1 0
1 0 0 1 0
0 1 0 1 1
0 0 0 0 1

重点又又又来了🙂:

布尔值A 逻辑运算符布尔值B(表达式的值:布尔值)

大家一定要牢记于心,我们来看看一些例题:

判断一个数a是否满足,有很多初学者会这样写:

cpp 复制代码
2 <= a <= 17

但这是大错特错的,在C++中,程序是顺序执行 的,它会先执行2<=a,不论结果如何,返回的一定是一个布尔值,可布尔值如何跟17进行比较,所以我们要用上逻辑运算符,这样写:

cpp 复制代码
2 <= a && a <= 17

只有两种条件都满足了,也就是满足了,结果才为真。

判断一个数是否是3或5的倍数:

a % 3 == 0 || a % 5 == 0

C++逻辑运算四句口诀

  1. ​"非先算,与或后"​! > && > ||
  2. ​"或一真,与全真"​|| 一真即真,&& 全真才真)
  3. ​"区间判,与相连"​a>=2 && a<=17
  4. ​"整除判,或相连"​num%3==0 || num%5==0

🌰 例子秒懂

  • !flag && (x>5) → 先算!flag,再算&&(口诀1)
  • age>=18 || score>90 → 满足一个即真(口诀2)
  • 2<=a && a<=17 → 区间必须用&&(口诀3)
  • n%3==0 || n%5==0 → 3或5的倍数(口诀4)

⚡ 核心:优先级+短路求值+区间写法,四句搞定所有逻辑判断! ✨

在写逻辑表达式时,一定要注意优先级,如果优先级靠后的那个运算符,一定要加括号!

对于布尔类型,需要研究的知识有很多,这对于以后的基础都非常重要,小编之后也会带着大家一起练习。

四、字符型

字符常量是由单个字符组成,所有字符采用 ASCII 编码,通用 ASCII 编码共有 128 个字符。在程序中通常用一对单引号将单个字符括起来表示一个字符常量。如:'a','0','A'。

名称 数据类型 字节数 数据范围
字符 char 1B -128~127
无符号字符 unsigned char 1B 0~255

ASCll码

ASCII码:它是一种基础的字符编码标准 ,用7位二进制数(即0~127的十进制范围)表示128个字符。

  • 标准ASCII(0~127)​
    • 0~31 :控制字符(如换行\n、制表符\t、回车\r等)。
    • 32~126 :可打印字符:
      • 32:空格(
      • 48~57:数字 09
      • 65~90:大写字母 AZ
      • 97~122:小写字母 az
      • 其他:标点符号(如 !, @, # 等)。
    • 127:删除控制字符(DEL)。
  • 扩展ASCII(128~255)​ :非标准,依赖系统(如Windows-1252),表示特殊符号(如é, ©等)。

C++中的字符表示

cpp 复制代码
char a = 'A';//存储ASCII值65
cout << a << endl;
char a = 65;//定义a在ASCII中为A
cout << a;

输出:
A
A

我们可以使用转义字符,来实现一些输出(不要求掌握后两个)

名称 字符形式
换行 \n 0X0A
水平制表 \t 0X09
反斜杠 \\ 0X5C
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main(){
    cout << "大家好\n我是\t小猫\\";
    return 0;
}

大家可以运行看看

字符比较

这部分就要用到之前讲过的关系运算了,大家可以复习一下。(注意,这里我们所讲的是字符,不是字符串,字符串之间的比较方式为字典序)

字符比较和数字之前的比较一样,都是返回表达式的值为真还是假 ,但是字符比较的不是字符,而是ASCII中字母所代表的数字,举一些例子:

  • 表达式'a'>'b'的值,a在ASCII中为97, b为98,a应该比b小,这个表达式的值为假
  • '0'<'2',这个的值显然为真,因为48<50

在这里要补充一点,字符和字符之间是可以进行运算 的,参与运算的也是每个字母代表的ASCII值,结果也是数字,如'b'+1的结果是99。

ASCII中的常用转换

大小写转换

我们可以根据ASCII中的规律进行大小写转换,我们可以发现,大写字母和小写字母之间ASCII值只差了32(注意,小写字母转化成大写字母时,需要减去32,反之,则加上32),这样,就实现了C++中的大小写转换。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main(){
    char a = 'A';
    char b = a + 32;
    cout << a << endl << b;
    return 0;
}

转换成0~25

有时,我们为了看起来更方便一些,可以把字母转换成对应的0~25。怎么操作呢?对于小写字母,我们只要把对应的字母减去一个'a';对于大写字母,我们我们只要把对应的字母减去一个'A'

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main(){
    char a = 'C';
    cout << a - 'A' << endl;
    char b = 'c';
    cout << b - 'a' << endl;
}

注意!!!ASCII只针对于英文,中文无效

五、数据类型隐式转换

隐式转换是指在编程语言中,由编译器自动执行的类型转换过程,而无需显式指定。这种转换是为了保持操作的一致性,使不同类型的数据能够在一些特定的上下文中进行运算或操作。隐式转换通常涉及到较小范围数据类型较大范围数据类型的转换,以避免数据丢失或提高精度。


1. 隐式转换的通用规则

隐式转换通常发生在以下情况:

  1. 赋值时=
  2. 算术运算时+, -, *, /
  3. 函数调用时(参数类型不匹配)
  4. 初始化时 (如 int x = 3.14;

编译器会按照从低精度到高精度、从小范围到大范围的原则自动转换数据类型,以避免数据丢失。


2. 隐式转换的优先级

C++的隐式转换遵循类型提升(Type Promotion)​规则,优先级如下(从低到高):

数据类型 提升方向 示例
bool int true1, false0
char, short int 'A'65
int unsigned int -14294967295(32位系统)
int long intlong(如果 int 范围不足)
int float 55.0f
float double 3.14f3.14
double long double 3.143.14L

示例:算术运算时的隐式转换

cpp 复制代码
int a = 5;
float b = 3.14f;
auto result = a + b;  // int → float(a提升为float)
cout << result;       // 输出 8.14(float类型)

3. 整数提升(Integer Promotion)​

在算术运算中,​比 int 小的整型(如 charshort 会被提升为 int

cpp 复制代码
char c = 'A';  // ASCII 65
short s = 100;
auto sum = c + s;  // char → int, short → int(运算结果为int)
cout << sum;       // 输出 165(int类型)

4. 算术转换(Arithmetic Conversion)​

如果两个操作数类型不同,C++会按照以下规则转换:

  1. 如果有一个操作数是 long double,另一个转换为 long double。​
  2. 否则,如果有一个操作数是 double,另一个转换为 double。​
  3. 否则,如果有一个操作数是 float,另一个转换为 float。​
  4. 否则,进行整数提升(char/shortint),然后按以下规则转换:​
    • 如果一个是 unsigned long,另一个转换为 unsigned long
    • 如果一个是 long,另一个是 unsigned int
      • 如果 long 能表示所有 unsigned int 值,则 unsigned intlong
      • 否则,两者都转换为 unsigned long
    • 如果一个是 long,另一个转换为 long
    • 否则,如果一个是 unsigned int,另一个转换为 unsigned int
    • 否则,两者都转换为 int

这就是所以内容了,内容较多,大家需要多多理解。下期我们一起练习,掌握它😄

整篇文章码字不易,大家能不能点个赞💗呢,谢谢

有什么问题可以在评论区讨论👬

备注:文章中有部分图片来自于百度

相关推荐
xidianhuihui10 分钟前
go install报错: should be v0 or v1, not v2问题解决
开发语言·后端·golang
架构师沉默13 分钟前
Java优雅使用Spring Boot+MQTT推送与订阅
java·开发语言·spring boot
iamlujingtao28 分钟前
js多边形算法:获取多边形中心点,且必定在多边形内部
javascript·算法
算法_小学生30 分钟前
逻辑回归(Logistic Regression)详解:从原理到实战一站式掌握
算法·机器学习·逻辑回归
DebugKitty1 小时前
C语言14-指针4-二维数组传参、指针数组传参、viod*指针
c语言·开发语言·算法·指针传参·void指针·数组指针传参
qystca1 小时前
MC0241防火墙
算法
Bio Coder1 小时前
R语言中 read.table 和 read.delim 之间的区别
开发语言·r语言
charlie1145141912 小时前
设计自己的小传输协议 导论与概念
c++·笔记·qt·网络协议·设计·通信协议
LZQqqqqo3 小时前
C#_ArrayList动态数组
开发语言·windows·c#
睿思达DBA_WGX3 小时前
Python 程序设计讲义(27):字符串的用法——字符串的常用操作
开发语言·python