【C/C++基础入门】二、数据类型
文章目录
2. 数据类型
- C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。
-
按照计算机的存储方式可分为两大基本类型:整数类型和浮点数类型。
2.1 字节与位
位: 计算机最小的存储单元是位(bit),可以储存0或1(或者说,位用于设置“开”或“关”)。
字节: 字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1字节均为8位。既然1位可以表示0或1,那么8位字节就有256(2的8次方)种可能的0、1的组合。通过二进制编码(仅
用0和1便可表示数字),便可表示0~255的整数或一组字符。
2.2 整型
1、在C/C++中,整数就是没有小数部分的数。
2、C++的基本整型(按宽度递增的顺序排列)分别是char、short、int、long和C++11新增的long long,==他们的区别就是占用的内存空间不同。==其中每种类型都有符号版本和无符号版本,因此总共有10种类型可供选择。
3、计算机以二进制数字储存整数,例如,整数7以二进制写是111。
2.2.1 short、int、long、long long
- C/C++提供了一种灵活的标准,它确保了最小长度,如图所示:
1、 short 至少16位;
2、 int 至少与 short 一样长;
3、 long 至少32位,且至少与int一样长;
4、 long long 至少64位,且至少与 long 一样长。 - 意义: 给变量分配合适的内存空间,避免空间浪费问题
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short(短整型) | 2字节(16位) | (-215~215-1) |
int(长整型) | 4字节(32位) | (-231~231-1) |
long(长整型) | windows为4字节(32位),Linux为4字节(32位),8字节(64位) | (-231~231-1) |
long long(长长整形) | 8字节(64位) | (-263~263-1) |
整型结论:short < int <= long <= long long |
- 声明变量: 数据类型 数据名称
- 初始化变量: 数据类型 数据名称 = 变量初始值;
在C/C++中初始化可以直接在声明中完成。
int hogs = 21;
int cows = 32, goats = 14;
总结: 声明为变量创建和标记存储空间,并为其赋值。
2.3 浮点型
1、浮点数与数学中实数的概念差不多。2.75、3.16E7、7.00 和 2e-8 都是浮点数。注意,在一个值后面加上一个小数点,该值就成为一个浮点值。所以,7是整数,7.00是浮点数。显然,书写浮点数有多种形式。
2、关键要理解浮点数和整数的储存方案不同。计算机把浮点数分成小 数部分和指数部分来表示,而且分开储存这两部分。因此,虽然7.00和7在 数值上相同,但是它们的储存方式不同。在十进制下,可以把7.0写成 0.7E1。这里,0.7是小数部分,1是指数部分。
2.3.1 float、double、long double
作用: 用于表示小数
浮点型变量分为三种
1. 单精度float
2. 双精度double
3. long double
区别在于表示的有效数字范围不同用
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
long double | 10、12、16字节 | 不比 double 低 |
2.4 数据溢出
- 整数溢出
#include <stdio.h>
int main(void)
{
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d\n", i, i+1, i+2);
printf("%u %u %u\n", j, j+1, j+2);
return 0;
}
运行结果如下:
把无符号整数j看作是汽车的里程表。当达到它能表示的最大值时,会重新从起始点开始。整数 i 也是类似的情况。它们主要的区别是,在 超过最大值时,unsigned int 类型的变量 j 从 0开始;而int类型的变量i则从 −2147483648开始。
- 浮点数的上溢与下溢
假设系统的最大float类型值是3.4E38,编写如下代码:
float toobig = 3.4E38 * 100.0f;
printf("%e\n", toobig);
这是一个上溢(overflow)的示例。当计算导致数字过 大,超过当前类型能表达的范围时,就会发生上溢。在这种情况下会给toobig赋一个表示无穷大的 特定值,而且printf()显示该值为inf或infinity(或者具有无穷含义的其他内 容)。
当除以一个很小的数时,情况更为复杂。回忆一下,float类型的数以指 数和尾数部分来储存。存在这样一个数,它的指数部分是最小值,即由全部 可用位表示的最小尾数值。该数字是float类型能用全部精度表示的最小数 字。现在把它除以 2。通常,这个操作会减小指数部分,但是假设的情况 中,指数已经是最小值了。所以计算机只好把尾数部分的位向右移,空出第 1 个二进制位,并丢弃最后一个二进制数。以十进制为例,把一个有4位有 效数字的数(如,0.1234E-10)除以10,得到的结果是0.0123E-10。虽然得 到了结果,但是在计算过程中却损失了原末尾有效位上的数字。这种情况叫 作下溢(underflow)。
2.5 char 型
作用: 字符型便于用于显示单个字符
语法: char 变量名 = ‘单一字符’
数据类型 | 占用空间 | 取值范围(有符号) | 取值范围(无符号) |
---|---|---|---|
char | 一个字节(8位) | -128~127(signed char) | 0~255(unsigned char) |
-
注意1:在现实字符型变量时,用单引号将字符括起来,不要用双引号
-
注意2:单引号内只能有一个字符,不可以是字符串
-
C/C++中字符型变量只占用一个字节。
-
字符型变量并不是把字符本身放到内存中储存,而是将对应的ASCII编码存放到存储单元中
char类型用于存储单个字符(字母,数字,标点符号)char是整数类型,因为char类型实际上存储的是整数而不是字符
2.6 bool 型
C99标准添加了 Bool 类型,用于表示布尔值,即逻辑值true和false。因 为C语言用值1表示true,值0表示false,所以 Bool 类型实际上也是一种整数 类型。但原则上它仅占用1位存储空间。
2.7 转义字符
作用: 用于表示一些不能显示出来的ASCII字符,单引号只适用于字符、数字和标点符号,浏览ASCII表会发现,有些ASCII字符打印不出来。
#include <iostream>
using namespace std;
int main(){
cout << "hello world\n"; // \n是换行
cout << "\\" << endl; // \\时输出“\”
cout << "aaa\thello world" << endl;
/* \t表示tab,固定八个字符,不够八个用空格补充,可以更整齐的输出后面的内容*/
cout << "aaaaaa\thello world" << endl;
system("pause");
return 0;
}
2.8 sizeof关键字
作用: 利用sizeof可以统计数据类型所占内存大小(以字节位单位)
语法: sizeof(数据类型/变量)
示例:
#include <iostream>
using namespace std;
int main(){
//利用sizeof求出数据类型或者变量所占的内存空间
short num1 = 10;
cout << "short占用的空间为:" << sizeof(short) << endl;
cout << "short占用的空间为:" << sizeof(num1) << endl;
system("pause");
return 0;
}
对于类型,应写 成sizeof(char)或sizeof(float);对于特定量,可写成sizeof name或sizeof 6.28。 尽管如此,还是建议所有情况下都使用圆括号,如sizeof(6.28)。