内置的 c++ 类型分两组:基本类型和复合类型。基本类型包括整型和浮点型。在基本类型的基础上创建的为复合类型,包括数组、字符串、指针和结构。
本节主要介绍基本类型中的整形。
整数就是没有小数部分的数字,比如2、98、-1、0。c++为用户提供好几种整型,不同的 c++ 整型提供不同的内存量来储存整数,使用的内存量越大,可以表示的整数范围也越大。术语宽度用于描述储存整数时使用的内存量,使用的内存越多则越宽。符号类型可表示正值和负值,无符号类型不能表示负值。c++ 的基本整型包括(按宽度递增的顺序排列)char 、short 、int、long、long long,其中每种类型都有符号类型和无符号类型,因此总共有10种类型可供选择。
1、位和字节
计算机内存的基本单元是位(bit),每一个位有两种状态:0和1 。因此8位的组合有 2^8 =256种,可以表示 0 ~ 255 或者 -128 ~ 127 。
通常一个字节(bite)指的是8位的内存单元。通常来说可以用8位字节来度量计算机的内存量,即1KB = 1024 B,1MB = 1024KB。但是c++略有不同,c++字节由至少能够容纳实现的基本字符集的相邻位组成,也就是说,可能取值的数目必须等于或超过字符数目。
比如在ASCII码中,基本字符不到128个(基本字符就是数字、字母以及一些特殊符号如*),那么一个字节就可以用8位表示,但是如果编程使用的字符集超过了128个(比如国际编程中使用的Unicoude),那么用8位字节不能完全表示基本字符,编程就会出现错误。比如我编程时需要符号 z ,但是程序不能给出符号 z。
2、整型short、int、long、long long
2.1 各个类型需要满足的条件
- short 至少 16 位;
- int 至少与 short 一样长;
- long 至少 32 位,且至少与 int 一样长;
- long long 至少 64 位,且至少与 long 一样长。
当前很多系统都使用最小长度,即short为 16 位,long为 32 位,这样 int 有多种选择,即可以为 16 位、24 位和 32 位。
2.2 头文件 climits
头文件 climits 定义了符号常量,如 INT_MAX 表示 int 能够储存的最大值。在使用 16 位的 int 的老系统中,climits 文件将 INT_MAX定义为32767(2^16 - 1)
符号常量为预处理命令定义的,将一个符号定义为一个常量,在之后的程序段中,使用这个符号即表示使用这个常量,这样的方法是为了方便修改常量值,因为当需要修改时,只需要更改程序段开头的符号常量的定义值
2.3 初始化
初始化将赋值与声明合并在一起,这样可以避免以后忘记给它赋值的情况发生。因为如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的,这意味着该变量的值将是它被创建之前,相应内存单元保存的值。初始化示例如下:
int n_int = 32767;
int n_int(32767); // c++ 里面独有的初始化方法
3、无符号整型
创建无符号整型时,使用关键字 unsigned,此处的 unsigned 实际为 unsigned int 的缩写。示例如下:
unsigned short a;
unsigned int b;
unsigned long c;
unsigned long long d;
同样可使用与符号整型相同的初始化方法进行初始化。
另外,因为储存数据时采用的是二进制计数,当数字溢出时,其值将为范围另一端的取值。比如 8 位数据,当二进制表示为11111111时,此时再加上一个数,那么该数变为 0 。
下面用一段程序进行演示:
// exceed .cpp -- exceeding some integer limits
#include <iostream>
#include <climits>
int main()
{
using namespace std;
short a = SHRT_MAX; //将 short 的最大值赋值给a
unsigned short b = 0;//给无符号 short 变量 short 赋值为0
cout << "now a and b is: " << a << ", " << b << endl; //输出a 和 b
a = a + 1; // a 本身为 short 可以表示的最大值,现在给 a 加 1,那么 a 溢出,得到 short 范围另一端的取值
b = b - 1; // b 本身为无符号类型,给其减 1 ,那么其值同样溢出,得到另一端的取值
cout << "a + 1 = :" << a << endl << "b - 1 = :" << b << endl;
return 0;
}
输出结果为: