### 算术运算符

算术运算符在程序中经常会使用，主要包括+（加）、-（减）、*（乘）、/（除）和%（取模）共 5 种运算，如表 1 所示。

表 1 C++算术运算符

算术运算符 | 描述
+ | 加法运算
- | 减法运算
* | 乘法运算
/ | 除法运算
% | 取模运算

算术运算符的使用比较简单，这里我们主要介绍在进行算术运算的过程中可能会出现溢出的情况。分析下面的语句。

short nHeight = 1000; //定义一个有符号短整型变量，初始化为 1000

short nLen = 50; //定义一个有符号短整型变量，初始化为 50

short nArea = nHeight * nLen; //将两个变量相乘赋值给有符号短整型变量 nArea

上面的语句执行后，变量 nArea 的值并不是预期的 50000，而是-15536。出现这种情况是由于数据溢出造成的。我们知道短整数占用 2 个字节，表示的数据范围（有符号短整数）在-32768~32767 之间。而 nHeight * nLen 的结果为 50000，超出了有符号短整数的表示范围，造成了数据溢出。

对于 nArea 的结果为-15536 是有根据的。我们知道短整数占 2 个字节，共 16 位，对于有符号短整数来说，最高位是符号位，如果为 0，表示正数，为 1，表示负数。50000 对应的二进制表示如图 1 所示。

图 1 数值 50000 的二进制示意图

由于 nArea 是有符号短整数，最高位是符号位，因此将 50000 赋值给有符号短整数时，将出现负数，因为最高位是 1。去除最高位 1，其余部分表示的是数据部分（伪数据部分），如图 21 所示。

图 2 有符号短整数数据存储示意图 1

在图 2 表示的数据部分，我们称之为伪数据部分，因为它并不是 50000 正真的有符号短整数的二进制表示方法。因为二进制数据在计算机中是以补码的形式表示的，正数的补码是它本身，而负数的补码是对该数的绝对值按位取反，再加 1。因此数值 50000 转换为有符号短整数的二进制为“10111100101100000”，如图 3 所示。

图 3 数值 50000 有符号短整数二进制示意图

这样，第一位符号位为 1，即“-”，剩余的数据部分为“0111100101100000”，表示的整数为 15536，因此 50000 转换为有符号短整数的数据为-15536。

通过上面两个短整数相乘的实例，可以总结一条编程经验。如果表达式的运算结果比较大，需要定义一个适当数据类型的变量，存储其结果，防止出现数据溢出。例如，在上例中，如果将 nArea 定义为 int 类型、long 类型，甚至更安全的_int64 类型，则不会出现数据溢出的情况。

注意：在使用除法运算符时，两个整型数相除的结果也是整数，例如：5/2 的结果为 2，而不是 2.5。