目录

蓝桥杯之c++入门(一)【数据类型】

目录

  • 前言
  • 数据类型
    • [1.1 字符型](#1.1 字符型)
    • [1.2 整型](#1.2 整型)
    • [1.3 浮点型](#1.3 浮点型)
    • [3.4 布尔类型](#3.4 布尔类型)
    • [1.5 signed 与 unsigned](#1.5 signed 与 unsigned)
    • [1.6 数据类型长度](#1.6 数据类型长度)
      • [1.6.1 sizeof 操作符](#1.6.1 sizeof 操作符)
      • [1.6.2 各数据类型长度](#1.6.2 各数据类型长度)
    • [1.7 各类型取值范围](#1.7 各类型取值范围)
    • [1.8 typedef](#1.8 typedef)
    • [1.9 练习](#1.9 练习)
  • 总结

前言

上一期我们通过一个简单的c++程序了解到了c++的main函数,头文件,名字空间,这期我们继续来了解c++的数据结构。


数据类型

C++中提供了丰富的数据类型来描述⽣活中的各种数据。⽐如:可以使⽤整型 类型来描述整数,使⽤字符 类型来描述字符,使⽤浮点型类型来描述⼩数。

所谓 "类型" ,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。

下⾯主要探讨简单数据类型。

1.1 字符型

cpp 复制代码
 char //character的缩写

在键盘上可以敲出各种字符,如: a , q , @ , # 等,这些符号都被称为字符,字符是⽤单引号括起来的,如: 'a' , 'b' , '@' 。为了能说明这些字符,给他们抽象出⼀种类型,就是字符型,C语言中就是 char 。

ASCII编码

我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆进制存储的呢?如果我们每个⼈自己给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为了⽅便⼤家相互通信,不造成混乱,后来**美国国家标准学会(ANSI)**出台了⼀个标准 ASCII 编码,C语言中的字符就遵循了 ASCII 编码的方式。

参考:https://zh.cppreference.com/w/cpp/language/ascii

我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数据:

• 字符 A~Z 的ASCII码值从 65~90
• 字符 a~z 的ASCII码值从 97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是 32
• 数字字符 0~9 的ASCII码值从 48~57
• 换⾏ \n 的ASCII值是: 10
• ASCII码值从0~31 这32个字符是不可打印字符,无法打印在屏幕上观察

cpp 复制代码
#include <iostream>
using namespace std;
int main()
 {
 	char c1 = 'Q';
 	cout << c1 << endl;
 	char c2 = 81;
 	cout << c2 << endl;  //Q的ASCII码是81
 	return 0;
 }

1.2 整型

整型类型是对所有整数的抽象,为了能对整数形成统⼀的类型标识,就有整型;

在 C 和 C++ 中 整型被分为四⼤类: short 、 int 、 long 、 long long 。

cpp 复制代码
short [int] //短整型
int //整型
long [int] //⻓整型
long long [int] //更⻓的整型

1.3 浮点型

浮点型式对所有实数(⼩数)的抽象,为了能对实数进⾏统⼀的类型标识,就有了浮点型。

浮点型有三种:

cpp 复制代码
float //单精度浮点型 
double //双精度浮点型
long double //更⻓的双精度浮点型
cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
	char c = 'a';
	short s = -10;
	int i = -10;
	long l = 34;
	long long ll = 345;
	float f = 1.334f;
	double d = 3.14;
	long double = 123.514;
	
	return 0;
}

在C/C++中⼩数的书写形式:

cpp 复制代码
3.14; //编译器会默认识别为double类型
3.14f; //编译器会默认识别为float类型
1e5; //这种写法是科学计数法的形式,意思是1.0*10^5
1e5+10; //1*100000+10 == 100010
1.23e5+10; //1.23*100000+10 = 123010

3.4 布尔类型

C++有⼀种类型叫: bool (布尔类型),布尔类型 的变量的值可以是 true 或 false ,这种类型类型的变量专⻔⽤来表⽰真或假的。当然在C和C++中,0表示假,⾮0表示真,有时候不使用 bool 类型也能表达相同的逻辑。

cpp 复制代码
bool

代码演示:

cpp 复制代码
//代码1
#include <iostream>
using namespace std;
int main()
{
 bool flag = true;
 if (flag)
 printf("I like C++!\n");
 return 0;
}
//代码2
#include <iostream>
using namespace std;
int main()
{
 int flag = 0;
 cin >> flag; //如果输⼊⾮零的值,flag就表⽰真
 if (flag)
 printf("I like C++!\n");
 return 0;
}

1.5 signed 与 unsigned

signed 和 unsigned 关键字 修饰字符型和整型类型的。

signed 关键字 ,表示⼀个类型带有正负号,包含负值;比如:温度、银行存款。
unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数,比如:年龄。有了 signed 和 unsigned 的修饰,字符和整型类型其实更加丰富,可以有以下这些:

cpp 复制代码
//字符型
char
signed char //有符号的字符类型
unsigned char //长符号的字符类型
//短整型
short [int]
[signed] short [int] //有符号的短整型
unsigned short [int] //无符号的短整型
//整型
int
[signed] int //有符号的整型
unsigned [int] //无符号的整型

//?整型
long [int] 
[signed] long [int] //有符号的长整型
unsigned long [int] //无符号的长整型
//更长的整型
long long [int]
[signed] long long [int] //有符号的
unsigned long long [int] //?符号的

对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int 。由于这是默认情况,关键字 signed ⼀般都省略不写,但是写了也不算错。

cpp 复制代码
signed int a; //等同于int a,⼀般不写signed

int 类型也可以不带正负号,只表示⾮负整数。这时就必须使⽤关键字 unsigned 声明变量。

cpp 复制代码
unsigned int a; // unsigned int:⽆符号整数类型

变量声明为 unsigned 的好处是,同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍。比如,16位的 signed short int 的取值范围是: -32768~32767 ,最⼤是 32767 ;

而unsigned short int 的取值范围是: 0~65535 ,最⼤值增⼤到了 65535 。32位的 signed int 的取值范围可以参看 climits 中给出的定义。

下⾯的定义是Dev-C++环境中, climits 中相关定义,其实如果仔细看 climits 中也是包含的limits.h 。

cpp 复制代码
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffffU //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值

unsigned int ⾥⾯的 int 可以省略,所以上⾯的变量声明也可以写成下⾯这样

cpp 复制代码
 unsigned a;

字符类型 char 也可以设置 signed 和 unsigned 。

cpp 复制代码
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255

⼩提⽰:

注意, char 类型到底是 signed char 还是 unsigned char ,由编译器决定。⼤部分的编译器上 char 就是 signed char 。

这就是说, char 不等同于 signed char ;它有可能是 signed char ,也有可能是unsigned char 。这⼀点与 int 不同, int 就是等同于 signed int 。

1.6 数据类型长度

每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量长度的不同,存储的数据范围就有所差异。

1.6.1 sizeof 操作符

sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算特定数据类型的⻓度的,单位是字节。
sizeof 操作符的操作数可以是类型,也可是变量名或者表达式, sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。

cpp 复制代码
sizeof( 类型 )
sizeof 表达式

sizeof 的计算结果是 size_t 类型的, size_t 指的是⽆符号整数(该类型包含了所有可能的unsigned int , unsigned long , unsigned long long 等类型,具体是取决于编译器的)。

cpp 复制代码
#include <stream>
using namespace std;
int main()
{
 int a = 10;
 cout << sizeof(a) << endl;
 cout << sizeof a << endl; //a是变量的名字,可以省略掉sizeof后边的(),但不建议去掉
 cout << sizeof(int) << endl;
 return 0;
}

1.6.2 各数据类型长度

cpp 复制代码
#include <stream>
using namespace std;
int main()
{
 cout << sizeof(char) << endl;
 cout << sizeof(bool) << endl;
 cout << sizeof(short) << endl;
 cout << sizeof(int) << endl;
 cout << sizeof(long) << endl;
 cout << sizeof(long long) << endl;
 cout << sizeof(float) << endl;
 cout << sizeof(double) << endl;
 cout << sizeof(long double) << endl;
 return 0;
}

在DevC++下的输出:

cpp 复制代码
1
1
2
4
4
8
4
8
16

注:

这里我们发现long和int的数据类型长度都为4,这是因为C/C++的标准库规定,long的数据类型长度必须大于等于int的数据类型长度,所以有的编译器是4,有的编译器是8;

该如何理解这些数据类型的⻓度呢?其实我们使⽤这些数据类型可以向内存申请空间(就是创建变量),不同的数据类型⼀次性申请的空间⼤⼩是有差异的。你可以这样理解:

1.7 各类型取值范围

前⾯的知识已经让我们了解到了很多的数据类型,不同的数据类型所创建的变量的⻓度是有差异的,这个⻓度差异⼜决定了,这种变量中能存储的值的⼤⼩。

其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。

下⾯是不同数据类型的取值范围。

类型 取值范围 速记最小值 速记最大值
char -128~127 CHAR_MIN - 2^7 CHAR_MAX 2^7 - 1
unsigned char 0~255 0 UCHAR_MAX 2^8 - 1
short -32878~32767 SHRT_MIN - 2^15 SHRT_MAX 2^15 - 1
unsigned short 0~65535 0 USHRT_MAX 2^16 - 1
int -2147483648~2147483647 INT_MIN - 2^31 INT_MAX 2^31 - 1
unsigned int 0~4294967295 0 UINT_MAX 2^32 - 1
long -2147483648~2147483647 LONG_MIN - 2^31 INT_MAX 2^31 - 1
unsigned long 0~4294967295 0 ULONG_MAX 2^32 - 1
long long -9223372036854775808~9223372036854775807 LLONG_MIN - 2^63 LLONG_MAX 2^63 - 1
unsigned long long 0~18446744073709551615 0 ULLONG_MAX 2^64 - 1

为了代码的可移植性,和方便记忆,需要知道某种整数类型的极限值时,经常使⽤这些速记的符号。
limits.h ⽂件中说明了整型类型的取值范围。(C++中头⽂件的名字是 )
float.h 这个头⽂件中说明浮点型类型的取值范围。(C++中头⽂件的名字是 )

⼤家对这些类型的取值范围还得⼤概知道取值范围的数量级,像 int 类型取值⼤概就

是: − 2.1 ∗ 1 0 9 2.1 ∗ 1 0 9 -2.1*10^9~2.1*10^9 −2.1∗109 2.1∗109,这⾥就是10^9这样的数量级。

1.8 typedef

在C++中有⼀个关键字是和类型有关的,是⽤来给类型重命名的。当有⼀个类型⽐较复杂的时候,可以简化类型。 typedef 在竞赛中经常使⽤,可以提升编码速度。typedef使⽤的基本语法形式:

cpp 复制代码
typedef 旧类型名 新类型名;

比如:

cpp 复制代码
typedef unsigned int uint; 
typedef long long ll;
typedef unsigned long long ull;

上⾯代码的意思是将 unsigned int 类型重命名为 uint ,使⽤ uint 创建的变量和使用unsigned int 是⼀样的,其他几个也是⼀样的道理。

cpp 复制代码
uint num1 = 0;//等价于 unsigned int num1 = 0;
ll num2 = 0; //等价于 long long num2 = 0;
ull num3 = 0; //等价于 unsigned long long num3 = 0;

1.9 练习

练习1:

整数

链接:https://ac.nowcoder.com/acm/problem/21985

来源:牛客网

牛牛刚刚出生,嗷嗷待哺,一开始他只能学说简单的数字,你跟他说一个整数,他立刻就能学会。

输入一个整数,输出这个整数。

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    
    cin >> a;
    cout << a << endl;
    return 0;
}

练习2:

打印字符

输入一个 ASCII 码,输出对应的字符。
输入格式

一个整数,即字符的 ASCII 码,保证存在对应的可见字符。

输出格式

一行,包含相应的字符。

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    char c = n;
    cout << c << endl;
    return 0;
}

题⽬中说明:"⼀个整数,即字符的 ASCII 码",那么就必须使⽤⼀个int类型的变量来输⼊数值。因为C++的 cin 是根据变量的类型在缓冲区读取数据的。换成 char 类型是不⾏的,虽然 char 类型的变量也是能存储这个ASCII值的。

练习3:

倒序

输入三个数,反序输出这三个数。

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
    int a,b,c;
    cin >> a >> b >> c;
    cout << c <<' '<< b << ' ' << a;
    return 0;
}

注意题⽬中数据范围的提⽰,a, b, c 正好是int的取值范围内,所以a, b, c定义为int类型就是合适的。

练习4:

整型数据类型存储空间⼤⼩

分别定义int,short类型的变量各一个,并依次输出它们的存储空间大小(单位:字节)
【输入】

(无)

【输出】

一行,两个整数,分别是两个变量的存储空间大小,用一个空格隔开。

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
 int n = 0;
 short s = 0;
 cout << sizeof(n) << " " << sizeof(s) << endl;
 
 return 0;
}

总结

这期我们主要介绍了c++中的数据类型,下期见。


本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
誓约酱2 小时前
(每日一题) 力扣 179 最大数
c语言·c++·算法·leetcode·职场和发展
2301_792185882 小时前
力扣:3305.元音辅音字符串计数
c++·算法·leetcode
weixin_468466854 小时前
C++蓝桥杯皮亚诺曲线距离求解
c++·算法·蓝桥杯·递归·皮亚诺·pow函数误差·皮亚诺曲线距离
桦05 小时前
每天一道算法题【蓝桥杯】【山脉数组的峰顶索引】
c++·算法·leetcode·蓝桥杯
axxy20006 小时前
C++ Primer Plus第十二章课后习题总结
c++
十年一梦实验室7 小时前
【C++】 嵌套类(Nested Class)
开发语言·c++
矛取矛求7 小时前
C++ 模板初阶总结
开发语言·c++
lrydnh7 小时前
MFCday01、模式对话框
c++
小辉同志8 小时前
146.LRU缓存
c++·算法·链表·缓存·力扣
shix .8 小时前
爬虫一些基础知识的备忘录(需要自取)
c++·爬虫·python