【C++基础】第五课:基本内置类型

算术类型,空类型,比特,字,字节,带符号类型,无符号类型

Posted by x-jeff on April 6, 2019

【C++基础】系列博客为参考《C++ Primer中文版(第5版)》C++11标准)一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.基本内置类型

C++定义了一套包括算术类型(arithmetric type)空类型(void)在内的基本数据类型。

👉算术类型:

  • 字符
  • 整型数
  • 布尔值
  • 浮点数

👉空类型:

  • 空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的是,当函数不返回任何值时使用空类型作为返回类型。

2.比特,字,字节

首先了解下计算机是怎么存储数据的。

👉比特:

计算机以比特序列存储数据,每个比特(bit)非0即1,例如:00011010101001111

👉字节:

大多数计算机以2的整数次幂个比特作为来处理内存,可寻址的最小内存块称为“字节(byte)”,在C++语言中,一个字节要至少能容纳机器基本字符集中的字符。通常情况下,一个字节为8比特。

👉字:

存储的基本单元称为字(word),它通常由几个字节组成,例如:1个字=2个字节,1个字=4个字节或1个字=8个字节等等。

👉数据的存储:

大多数计算机将内存中的每个字节与一个数字(被称为“地址(address)”)关联起来,在一个字节为8比特,字为32比特的机器上,我们可能看到一个字的内存区域如下所示:

其中,左侧是字节的地址,右侧是字节中8比特的具体内容。

我们能够使用某个地址来表示从这个地址开始的大小不同的比特串。

为了赋予内存中某个地址明确的含义,必须首先知道存储在该地址的数据的类型。类型决定了数据所占的比特数以及该如何解释这些比特的内容。

3.算术类型

算术类型分为两类:

  1. 整型(包括字符和布尔类型在内)
  2. 浮点型

算术类型的尺寸(也就是该类型数据所占的比特数)在不同机器上有所差别。

可以使用sizeof()返回一个对象或类型所占的内存字节数。

常见的算术类型的尺寸:

类型 尺寸(字节)
bool 1
char 1
int 4
float 4
double 8

3.1.整型

3.1.1.整型数

整型用于表示不同尺寸的整数。尺寸从小到大为:short<int<long<long long。此外,整型还能用于表示字符和布尔值。

3.1.2.布尔类型

布尔类型(bool)的取值是真(true)或者假(false)。通常情况下,可用整型数代表布尔值。整型数0表示false,非0整型数表示true

1
2
3
4
5
6
7
bool a=0;//false
bool b=2;//true
bool c=0.01;//error,必须为整型数
bool d=true;
cout<<d<<endl;//d=1
bool e=false;
cout<<e<<endl;//e=0

3.1.3.字符类型

基本的字符类型是char。一个char的空间应确保可以存放机器基本字符集中任意字符对应的数字值。

3.1.3.1.字符集

字符是各种文字和符号的总称。字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见的字符集有:

  1. ACSII字符集
  2. GB2312字符集
  3. BIG5字符集
  4. GB18030字符集
  5. Unicode字符集
  6. ……

计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。

不同的字符集有不同的编码方式。以ASCII字符集为例,标准ASCII码使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。7位二进制数可表示$2^7=128$种(即0~127)可能的字符。例如(部分ASCII编码):

Bin
(二进制)
Dec
(十进制)
缩写/字符 解释
0000 1101 13 CR (carriage return) 回车键
0010 0000 32 (space) 空格
0010 1011 43 + 加号
0010 1101 45 - 减号/破折号
0011 0000 48 0 字符0
0100 0001 65 A 大写字母A
0110 0001 97 a 小写字母a

因此可以用整型数来表示字符,例如:

1
2
3
char c1,c2;
c1='a';//c1='a'
c2=65;//c2='A'

还有一些其他字符类型用于扩展字符集,如wchar_tchar16_tchar32_t等。

3.2.浮点型

浮点型可表示单精度float、双精度double和扩展双精度long double

4.带符号类型和无符号类型

除去布尔型扩展的字符型之外,其他的整型可以划分为带符号的(signed)无符号的(unsigned)两种。

  • 带符号类型可以表示正数、负数或0
  • 无符号类型则仅能表示大于等于0的值
signed unsigned
int unsigned int
short unsigned short
long unsigned long
long long unsigned long long

❗️类型unsigned int可以缩写为unsigned

❗️与其他整型不同,字符型被分成了三种:charsigned charunsigned char。尽管字符型有三种,但是字符的表现形式却只有两种:带符号的和无符号的。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。

❗️无符号类型中所有比特都用来存储值。例如,8比特的unsigned char可以表示0至255区间内的值。

关于floatdouble的选择:

执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度运算甚至比单精度还快。

5.C++中float和double类型的存储

IEEE规定float和double类型的数据用三元组$[S,E,M]$表示:

  • S:符号位。负数时为1,非负为0。float为1位,double也为1位。
  • E:指数部分加上偏移量(4字节浮点数偏移量为127,8字节为1023)。float为8位,double为11位。
  • M:尾数部分,只取小数点后面的尾数,因为前面肯定是1,不需要存。float为23位,double为52位。
\[float = (-1)^S * (1.M) * 2^{(E-127)}\] \[double = (-1)^S * (1.M) * 2^{(E-1023)}\]

例如十进制数14.25,换算成二进制为1110.01,二进制科学计数法为$1.11001 \times 2^3$,所以此时有符号位$S=0$,指数部分$3+127=130$(换算成二进制为10000010),尾数部分为11001(只考虑小数点后面的尾数)。

6.参考资料

  1. 字符集(百度百科)
  2. ASCII(百度百科)