C++个人疑问集
十进制浮点数的二进制存储方式以及转换
V = (-1)s×M×2E
- (-1)s表示符号位,当s=0,V为正数;当s=1,V为负数
- M表示有效数字,大于等于1,小于2
- 2E表示指数
例如:将十进制178.125表示成机器内的32个字节的二进制形式
- 第一步:将178.125表示成二进制数:(178.125)(十进制数)=(10110010.001)(二进制形式);
十进制整数转换为二进制整数:除2取余,逆序排列
十进制小数转换为二进制小数:乘2取整,顺序排列 - 第二步:将二进制形式的浮点实数转化为规格化的形式:(小数点向左移动7个二进制位可以得到)
10110010.001=1.0110010001*27 因而产生了以下三项:- 符号位:该数为正数,故第31位为0,占一个二进制位
- 阶码:指数为7,故其阶码为127+7=134=(10000110)(二进制),占从第30到第23共8个二进制位
- 尾数:为小数点后的部分, 即0110010001.因为尾数共23个二进制位,在后面补13个0,即01100100010000000000000
所以178.125在内存中的实际表示方式为:
0|10000110 |01100100010000000000000
cerr、cout、clog的区别
- cout:标准输出流,用于常规输出,输入读进缓冲区,触发刷新缓冲区动作时输出缓冲区内容至终端显示器,也可被重定向输出至磁盘文件
- cerr:非缓冲的标准错误流,用于显示错误信息,错误信息不输入缓冲区,直接显示在终端显示器,一般情况下不被重定向
- clog:缓冲的标准错误流,一般用于记录运行日志,日志消息读进缓冲区,触发刷新缓冲区动作时输出缓冲区内容至终端显示器,一般情况下可被重定向输出至日志文件
tip:重定向在不同的操作环境定义不同
缓冲区的作用:计算机对缓冲区的操作快于磁盘操作,可以减少计算机对磁盘的读写次数,对低速的输入输出设备和高速的CPU之间进行协调工作。
触发刷新缓冲区的动作:
- 缓冲区满时
- 执行flush语句
- 行缓冲时遇到endl,cerr或cin时
- 关闭文件
cerr与clog的使用场景
- clog:clog为缓冲输出,cerr为无缓冲输出,缓冲输出通常比无缓冲效率高,所以记录日志一般使用clog
- cerr:由于clog为缓冲输出,当程序崩