文章目錄
- 概念掃盲
- 思想理解
- 經典好圖
- 安全事件
概念掃盲
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位有符號整數時發生溢出從而傳送無效數據