C++旧版课程库
C++第 1 期查看课程总览

031 数据类型转化1

主要内容

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

习题

课后练习