轻舟过
C++教程(二):基本内置类型

本帖最后由 轻舟过 于 2012-7-21 21:46 编辑

到这里看的话,排版可能会好看一些 http://bimania.org/2012/07/21/c-plus-plus-tutorial-2/

另外(一)在这里https://www.gn00.com/t-72636-1-1.html

类型是所有程序的基础。类型告诉我们数据代表什么意思以及可以对数据进行哪些操作,C++语言定义了几种基本类型,下面将对几种基本类型进行介绍。

基本内置类型

C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型,另外还定义了一种称为`void`的特殊类型。`void`类型没有对应的值,仅用在有限的一些情况下,通常用作无返回值函数的返回类型。

算术类型的存储需要占用一定空间,这里存储空间是指用来表示该类型的位(bit)数,C++的标准规定了每个算术类型的最小存储空间,但是实际上有些类型,几乎所有的编译器使用的空间都比所要求的大(比如`int`)。

整型

表示整数、字符和布尔值的算术类型合称为整型。

字符类型有两种:`char`和`wchar_t`。`char`类型保证能存储机器基本字符集中任何字符相应的数值,因此`char`类型通常是单个机器字节(byte)。`wchar_t`类型用于扩展字符集,比如汉字和日语,这些字符集中的一些字符不能用单个`char`来表示。

`short`、`int`、`long`类型都表示整数型值,存储空间大小不同,`int`通常是一个机器字长,在32位机上就是32位,`short`通常是半个机器字长,在32位机上就是16位,而`long`通常是一个或者两个机器字长,在32位机上`long`与`int`的字长是一样长的(`short`位数太少,在通常的计算中一般不使用,一般只是用`int`类型)。

`bool`类型表示逻辑值`true`和`false`,可以将算术类型的任何值付给`bool`对象。0值算术类型代表`false`,其余的值都代表`true`。

带符号和无符号类型

除`bool`类型外,整型可以是带符号和无符号的,无符号类型只能表示大于或者等于0的数,而带符号的可以表示正数和负数。三种类型都默认类型的带符号的,如果需要加上`unsigned`,比如`unsigned int`之类。

整型值的表示

对于无符号类型类来说,如果它是n位的,那么它可以取值0到2^n-1。对于n位有符号类型,通常会用1位来表示符号,因此它的取值范围为-2^(n-1), 到2^(n-1)-1。

浮点型

浮点型有`float`、`double`、`long double`三种,分别表示单精度浮点数、双精度浮点数和扩展精度浮点数。一般占用的空间依次为32位,64位,96或128位。对于实际的程序来说,`float`类型的精度通常是不够的,它只能保证6位有效数字,而`double`型可以保证10位有效数字,能满足大多数计算的需求。通常计算中使用`double`就可以了,而`long double`类型提供的精度通常没有必要,而且还要承担额外的运行代价。

字面值常量

像`42`这样的值,在程序中被当做字面值常量,因为它的值就是字面上看起来的那样。每个字面值都有相应的类型,例如:`0`是`int`型,`3.14`是`double`型等等。

整数字面值

定义字面值整数常量可以用十进制、八进制和十六进制。例如我们可以将值20定义成下面的任意一种:`20`,`024`,`0x14`。以`0`开头的字面值整数常量表示八进制,以`0x`或`0X`开头的表示十六进制。

字面值整数常量的类型默认为`int`或`long`,`int`还是`long`取决于值的大小。不过通过在值后面增加后缀可以将字面值强制转化为`long`,`unsigned`或`unsigned long`,通过在数值后面加`L`或者`l`指定字面值为`long`类型,在数值后面加`U`或`u`指定字面值为`unsigned`类型,同时加`L`和`U`就能得到`unsigned long`类型, 比如:

128u /* unsigned */ 1024UL /* unsigned long */

1L /* long */ 8Lu /* unsigned long */

浮点字面值

通常可以用十进制或者科学计数法来表示浮点字面值。使用科学计数法是,指数用`E`或者`e`表示。默认的浮点字面值常量为`double`类型。在数值后面加上`F`或`f`表示单精度。同样加上`L`或者`l`表示扩展精度。下面每一组字面值表示相同的值:

3.14159F .001f 12.345L 0.

3.14159E0f 1E-3F 1.2345E1L 0e0

布尔字面值

`true`和`false`是布尔型的字面值:

[mw_shl_code=cpp,true]bool test = false;[/mw_shl_code]

字符字面值

可打印字符的字面值通常用一对单引号来定义:

'a' '2' ',' ' ' // blank

这些字面值都是`char`类型的。在字符字面值前加`L`就能得到`wchar_t`类型的宽字符字面值。如`L'a'`。

另外还有一些不可打印或者在语言中有特殊意义的字符,需要通过转义字符来表示。转义字符都以反斜线符号开始,比较常用的有:

符号 | 转义序列

换行符 | `\n`

双引号 | `\"`

制表符 | `\t`

反斜线 | `\\`

单引号 | `\'`

另外我们也可以将任何字符表示为以下形式的通用转义字符`\ooo`, 这里`ooo`表示三个八进制数字,这三个数字表示字符的数字值。下面的例子是用ASCII码字符集表示字面值:

\7 (bell) \12 (newline) \40 (blank)

\0 (null) \062 ('2') \115 ('M')

字符`\0`通常表示空字符,下面将看到它有着非常特殊的含义。

当然也可以用十六进制转义字符来定义字符`\xddd`,它由一个反斜线、一个`x`和一个或者多个十六进制数字组成。

字符串字面值

字符串字面值常量用双引号括起来的零个或者多个字符表示,补课打印字符表示成相应的转义字符。

"Hello World!" // 字符串

"" // 空字符串

"\nCC\toptions\tfile.[cC]\n" // 包含换行和制表符的字符串

为了兼容C语言,C++中所有字符串字面值都由编译器自动在末尾添加一个空字符。因此`"A"`表示包含字母`A`和空字符`'\0'`两个字符的字符串。

在字符串字面值的前面加`L`,来表示宽字符串字面值。

日向枣
做了兩個小時的簡易筆記
展开Biu

做了兩個小時的簡易筆記orz【記性不好

[查看全文]
我曾叫没有人
非常全面
展开Biu

非常全面,点赞

[查看全文]
乖◐ω◑
学到东西了
展开Biu

学到东西了

[查看全文]
轻舟过
位運算的應用
展开Biu

terry182 发表于 2013-3-25 00:01

位運算的應用 :)

这种我感觉应该超出了语言的范畴了

不过位运算的应用还是非常有意思的

比如下面两个页面里提到的一些应用

http://www.matrix67.com/blog/archives/122

http://graphics.stanford.edu/~seander/bithacks.html

[查看全文]
terry182
二进制是说整数
展开Biu

轻舟过 发表于 2013-3-24 23:47

二进制是说整数、浮点数等的二进制表示、位运算之类的吗?

位運算的應用 :)

[查看全文]
轻舟过
论极语易
展开Biu

论极语易 发表于 2013-3-24 14:11

其实,应该加一点有关二进制类的东西在这里吧……毕竟这种东西,外面书上多的是,可是二进制类的很少 ...

二进制是说整数、浮点数等的二进制表示、位运算之类的吗?

[查看全文]
论极语易
应该加一点有关二进制类的东西在这里吧
展开Biu

其实,应该加一点有关二进制类的东西在这里吧……毕竟这种东西,外面书上多的是,可是二进制类的很少

[查看全文]
瞳月夜袭
瞳月夜袭回复给帖子:4948804
展开Biu

好仔细,谢谢,受教

[查看全文]