原始数据类型及相互转化
第二课
本文为本系列笔记的第一篇,因为第一课为整体课程介绍,无实质内容,但为了与课程保持一致,本系列笔记从第二课开始
c/c++ 原始数据类型
bool
char
short
int
long
float
double
1 字节
2 字节
4 字节
4 字节
4 字节
8 字节
举例
char ch = 'A'; // 65 -> 01000001
short s = 519; // 519 -> 00000010 | 00000111负数的表示形式
以 short 为例,1个 short 类型有 2 字节,共包含 65536 种状态。如果都表示自然数,那么可以表示 0~65535 之间的所有自然数。但我们希望计算机能区别正负数,此时最合乎逻辑的做法就是:
拿出这里面一半的状态来表示负数,即 -32767 ~ 32768
因此,取最高位比特 (most significant bit) 表示符号,最高位是 1 表示负数,最高位是 0 表示正数:
7: 00000000 00000111
-7: 10000000 00000111计算机中最基本的运算除了位运算就是加减法,如果用当前的表示法计算 -7 + 7:
00000000 00000111
+ 10000000 00000111
-------------------
= 10000000 00001000那么,我们得到的数字是 -8,我们希望计算计在运行时能更优雅地处理加减法,使得 -7 + 7 得到的数字是 0
将一个二进制正数转化为对应的计算机二进制负数:(同理)
这种表示法的学名是 2's complement
浮点数的表示形式
以 float 类型 (4 bytes) 来举例:为了表示浮点数,我们势必需要拿出一些位来表示小数部分 (fractions),如:
但通过观察可以知道:4 个字节一共只能表示 4294967296 种数字,而实数空间有无穷多个数,因此我们能准确表示的数非常有限。为了满足日常需求,我们希望更好地利用这 4 个字节来表示的数字>范围:
数量级范围较广
对于量级靠近 0 的数能尽量准确表示
因此,计算机科学家将 4 个字节拆成了 符号位,指数位和小数位来表示浮点数:
举例如下:
小端 (Little Endian) 和 大端 (Big Endian)
Endianness 指的是在多个字节表示的数值类型 (short, long, float, double) 中,字节的排列顺序。最高位所在的字节称为大端,最低位所在的字节称为小端。那么可以按如下方式记住小端存储和大端存储:
Little Endian -> Little End -> 从 Little End 开始存储
Big Endian -> Big End -> 从 Big End 开始存储
举例如下:
原始数据类型之间的转化
char 转 short
short 转 int
int 转 short
int 转 float
参考资料
Last updated