C++基本数据类型、表示与字长
布尔型bool:1byte
短整型short:2byte
整型int:4byte
长整型long:4byte
字符型char:1byte
单精度浮点型float:4byte
双精度浮点型double:8byte
其中除布尔型与浮点型外,其他数据类型均有有符号与无符号两种,字长相同。
数据是以补码的形式存储的,符号位0正1负
float 1个bit用来存储浮点数的符号,8个bit用来存储浮点数的指数,23个bit用来存储浮点数的尾数。对于double 1个bit用来存储浮点数的符号,11个bit用来存储浮点数的指数,52个bit用来存储尾数。
指数位:指数位既要能够表示出来正的指数同时也要能够表示出来负的指数。在设计上,为了存储,在实际的指数上加了一个偏移(bias)。对于IEEE 单精度的float为例,这个值是127。这样对于指数位为0,实际在指数位中存储的是127.对于指数位中存储的是200的指数,实际存储的是73(200-127)。
尾数:对于一个10进制的浮点数转化为科学计数法的2进制的形式都可以表示为1.f*,其中f表示的是二进制的尾数,例如3.5可以表示为1.11*。在存储上只需要存储f既可以,因为小数点前面永远都是1,这样可以省下来一个bit。
不同数据类型之间转换
数据范围由小到大:
byte – short – char
– int – long --float –double
从小范围类型->大范围的数据类型为数据类型提升,及在赋值或运算中自动从小范围类型变成大范围类型,如:
int a = 300;
float b;
b = a;
从大范围类型->小范围类型为强制类型转换,会损失精度,也有可能溢出
溢出的例子如下:
int c = 0x11fff;
short d = (int)c;
最终d的值为1fff,可见溢出时只取了低两个字节
精度损失是比如在运算中用到了double型但是赋值给int型,则将损失小数点后的数据。损失精度时是直接舍弃高精度数据的。
移位操作
左移:<<
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
右移:>>
如果最高位是0,右移空的位就填入0;如果最高位是1,右移空的位置就填入1(右移n位相当于将这个数除以2的n次方)
无符号右移:>>>
无论最高位是0还是1,左侧被移空的高位都填入0