文章目录
- 概念扫盲
- 思想理解
- 经典好图
- 安全事件
概念扫盲
1.大端高位在前,小端低位在前
2.逻辑运算符(&& 、||、!)与位级运算(&、|、~)的差异
3.宏可以保证无论代码如何编译,都能生成正确的格式字符串
4.补码最小值的逆元就是它本身
5. 非规格化数可以用于表示非常接近0.0的数,提供了逐渐下溢的属性
6. 对于任何x,NaN+
f
x
^fx
fx=NaN。即浮点数计算中NaN无逆元,无穷数同理
思想理解
1.内存中每个字节的唯一数字表示就是地址,所有地址集合为虚拟地址空间,是用于展现给机器程序的概念映像
2.文本数据比二进制数据具有更强的平台独立性
3.使用宏可以保证不管代码如何编译,都能生成正确的格式字符串
4.补码中最靠近0的负数映射为最大的无符号数
5.当有符号数和无符号数运算时,C语言会隐式将有符号数转换为无符号数
6.小于0的二进制补码除法(2)需要加上偏置,无法推广到除以任意常数
7.C标准中,short==>uint 要先改变大小为int再转为无符号
8.无符号数或者是补码的加法和乘法没有单调性,浮点数乘法没有结合性,这些问题对于科学应用影响很大
经典好图
补码加法边界图像化
NaN在表示未初始化的数据时有很多好处
可表示的浮点数分布图
安全事件
1.XDR库中利用乘法溢出导致的缓冲区溢出
修补方式如下:用64位整数(uint64_t)检查32整数(unsigned int)是否溢出
uint64_t asize = ele_cnt * (uint64_t) ele_size;
unsigned int asize2 = ele_cnt * ele_size;
if (asize == asize2) {//执行分配 }
else { //抛出异常}
2.爱国者导弹的精确性问题,软件更新导致不同函数读取的时间精度不同,长时间运行导致误差放大
3.Ariane 5爆炸,将64位浮点数转换成16位有符号整数时发生溢出从而传送无效数据