跳至正文
View Categories

1 min read

主要内容 #

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

习题 #

课后练习