主要内容 #
1. 不同数据类型的长度(以 32 位操作系统为例) #
1.1 各个数据类型长度一览 #
- 1 Bit: bool
- 1 Byte: char, unsigned char(还没有介绍)
- 2 Bytes: short, unsigned short
- 4 Bytes: int, unsigned int, long, unsigned long, float
- 8 Bytes: long long, unsigned long long, double
- 16 Bytes: long double
1.2 有符号/无符号的差别 #
- 无符号
unsigned short
- 有符号
short
这里的第一位,是定位为“符号位”。
这里为 0 ,则表示非负数(没有符号);
这里为 1 ,则表示负数(有符号);
2. 隐式(自动)类型转化 #
看了不同数据类型的长度后,我们回过头来思考这样的一个问题:
2.1 规则一 #
以下表达式的计算结果是什么?
short dashima_s = 1; int dashima_i = 1; ____ dashima_r1 = s + i; float dashima_f = 0.1; double dashima_d = 3.14; ____ dashima_r2 = f + d; ____ dashima_r3 = i + d;
像这样的问题,涉及到的是 C++ 中数据类型的互相转化的规则。
C++ 中,包含了一些自动转化的规则,详述如下:
- 低精度(长度短) -> 高精度(长度长)
上面的计算结果是
short dashima_s = 1; int dashima_i = 1; _int_ dashima_r1 = s + i; // 这里应该填 int。因为 int 占 4 字节,short 占 2 字节。 float dashima_f = 0.1; double dashima_d = 3.14; _double_ dashima_r2 = f + d; // 这里应该填 double。因为 float 占 4 字节,double 占 8 字节。 _double_ dashima_r3 = i + d; // 这里应该填 double。因为 int 占 4 字节,double 占 8 字节。
2.2 规则二 #
再请看:
int dashima_i = 1; unsigned int dashima_ui = 1; ____ dashima_r = i + ui;
- 规则二:有符号 -> 无符号
上面的计算结果是
int dashima_i = 1; unsigned int dashima_ui = 1; _unsigned int_ dashima_r = i + ui; // 这里应该填 unsigned int。有符号转化为无符号
2.3 规则三 #
再请看:
int dashima_i = 1; float dashima_f = 0.1; ____ dashima_r3 = i + f;
- 规则三:整型 -> 浮点型
上面的计算结果是
int dashima_i = 1; float dashima_f = 0.1; _float_ dashima_r3 = i + f; // 这里应该填 float。因为 int 占 4 字节,float 占 4 字节。
3. 隐式类型转化 – 小结 #
隐式类型转换方向:
bool -> char -> unsigned char -> short -> unsigned short -> int-> unsigned int -> long-> unsigned long -> float -> double -> long double