C++之基本内置类型(2.1)

作者: 厚朴儒学 | 来源:发表于2018-01-03 17:46 被阅读13次

声明:本文是学习《C++ Primer》(王刚 杨巨峰译)过程中记录下的摘抄笔记。感谢两位译者翻译之功!

C++定义了两种基本数据类型:算术类型和空(void)类型。算术类型包括字符、布尔值、整型数、浮点数;空类型不对应具体的值,应用于特殊场合,如函数不返回任何值时使用空类型作为返回类型。

算术类型

算术类型分为两类:整型(包括字符和布尔类型在内)和浮点型。

image.png

带符号类型和无符号类型

除去布尔型和扩展的字符型外,其他整型可划分为带符号类型(signed)和无符号类型(unsigned)两种。带符号类型可以表示为正数、0和负数;无符号类型仅能表示大于0的值。

short、int、long、long long都是带符号类型的,通过在类型名前添加unsigned就可得到无符号类型。如 unsigned int、unsigned long、unsigned long long,其中unsigned int可以缩写为unsigned。

与其他整型不同,字符型被分为了三种:char、signed char和unsigned char,类型char和signed char并不相同。尽管字符型有三种,但是字符的表现形式却只有两种:带符号和无符号的。类型char回表示为上述两种形式的一种,具体是哪种取决于编译器。

  1. 明确知晓数值不为负时,使用无符号类型;
  2. 使用int执行整数运算。实际应用中,short太小而long和int一般大,如果数值超过int,建议使用long long。
  3. 算术表达式中不要使用char或bool,只有在存放字符或布尔值时才使用。因为类型char在有些机器上是有符号,在有些机器是无符号的,所以用char运算可能回导致错误。如果需要使用一个不大的整数,明确指定它的类型是signed char或unsigned char。
  4. 执行浮点运算使用选用double,因为float通常精度不够而和double计算代价相当。甚至对于一些机器,double运算要比float要快。long double提供的精度一般情况下是不必要的,而且运行时的消耗也不可忽视。

类型转换

对象类型定义了对象所能包含的数据和参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换为另一种相关类型。

类型所能表示的值的范围决定了转换的过程:

  1. 把非布尔型的算术值赋给布尔类型时,初始值为0则结果为false,否则为true
  2. 把布尔值赋给非布尔型时,初始值为false则结果为0,初始值为true则结果为1
  3. 把浮点数赋给整数类型时,进行了近似处理,结果值仅保留小数点之前的部分
  4. 把整数值赋给浮点类型时,小数部分记为0。如果整数所占空间超过浮点类型的容量,精度可能会有损失
  5. 赋给无符号类型一个超出表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。如8bit大小的unsigned char可以表示0至255区间内的值,如果赋了一个区间外的值,则实际结果为该值对256取模后的余数。因此把-1赋给8bit的unsigned char所得结果为255
  6. 赋给带符号类型一个超出表示范围的值时,结果时未定义的。此时,程序可能继续工作、可能崩溃、也可能产生垃圾数据

注:切勿混用带符号类型和无符号类型,如果表达式里既有带符号类型也有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数回自动转换为无符号数。如在形如a*b的例子中,如果a=-1,b=1,而且a和b都是int,则表达式的值显然为-1。然而,如果a是int,而b是unsigned,则结果须由在当前机器上int所占位数而定。

字面值常量

形如42的值被称作字面值常量,每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。

整型和浮点型字面值

整型字面值可写作十进制数、八进制数和十六进制数的形式。以0开头的表示八进制数,以0x或0X开头的表示十六进制数。例如,能用下面任意一种形式表示数值20:

20      /* 十进制 */  
024     /* 八进制 */
014     /* 十六进制 */

整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值的带符号数,八进制和十六进制字面值可能是带符号也可能是无符号的。十进制字面值的类型是int、long和long long中容量最小的那个,当然前提是这种类型要能容纳下当前的值。八进制和十六进制字面值的类型是能容纳其数值int、unsigned int、long、unsigned long、long long、unsigned long long中容量最小者。如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。类型short没有对应的字面值

浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:

3.14159
3.14159E0
0.
0e0
.001

字符和字符串字面值

由单引号括起来的一个字符成为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。

'a'      // 字符字面值
"Hello World!"      //字符串字面值

字符串字面值的类型实际是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符('\0'),因此,字符串字面值长度要比内容长度多1。比如'A'表示的就是单独的字符A,而字符串"A"则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。

转义序列

由两类字符程序员不能直接使用:一类是不可打印的字符,如退格或其他控制字符,因为它们没有可视的图符;另一类是具有特殊含义的字符,如单引号、双引号、问号、反斜线。这种情况下,需要使用转义序列,转义序列均以反斜线开始,C++语言规定的转义序列包括:


image.png

也可以使用泛化的转义序列,形式为\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。以下是示例:


image.png
std:cout << "Hi  \x4dO\115!\n";            // 输出Hi MOM!,转到新一行

如果反斜线\后面跟着的八进制数字超过3个,只有前三个数字与\构成转义序列。例如,\1234表示2个字符,即八进制数字123对应的字符以及字符4。相反,\x要用到后面跟着的所有数字,例如,"\x1234"表示一个十六位的字符,该字符由这4个十六进制数对应的bit唯一决定。

指定字面值的类型

通过添加下表所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。


image.png

布尔字面值和指针字面值

布尔字面值为false和true。指针字面值后续介绍。

相关文章

  • C++之基本内置类型(2.1)

    声明:本文是学习《C++ Primer》(王刚 杨巨峰译)过程中记录下的摘抄笔记。感谢两位译者翻译之功! C++定...

  • 第二章 变量和基本类型

    2.1基本内置类型 C++定义了一套包括算术类型和空类型在内的基本数据类型。 2.1.1 算术类型 算术类型分为两...

  • c++ primer 阅读 day2

    第I部分 C++ 基础 2.1 基本内置类型 float 精度float和double的精度是由尾数的位数来决定的...

  • C++数据类型

    简介 C++数据类型包括基本内置类型、复合类型和自定义数据结构。 基本内置类型:编译器内置的基本类型,包括算数类型...

  • C++ Primer 第二章笔记

    Chapter 2 Variables and Basic Types 2.1 基本内置类型 2.1.1 算术类型...

  • 第二章(C++)~变量和基本类型

    学习并掌握一门编程语言,理解语法特征的实现细节是第一步 2.1 基本内置类型 c++的常用算术类型:int, sh...

  • C++与python差异(一)

    内置数据类型(1)c++的内置类型包括基本类型和复合类型,基本类型有算术类型和空类型两种,复合类型是基于基本类型定...

  • [C++ Primer]第二章 变量与基本类型

    2.1 基本内置类型 包括 算术类型 空类型(void) 2.1.1 算术类型 整型包括了char和bool 浮点...

  • c/c++语言基础

    c/c++语言基础 基本类型(基本内置类型) 构造类型 指针类型 引用类型 空类型 数组 预处理命令 基本类型 基...

  • 《c++primer》ch2 变量和基本类型

    数据类型决定了程序中数据和操作的意义。 2.1 基本内置类型 基本数据类型:** 算数类型 空类型(void) ...

网友评论

    本文标题:C++之基本内置类型(2.1)

    本文链接:https://www.haomeiwen.com/subject/psdvgxtx.html