很多學C語言的人忽略的事兒,0xff + 1=0?數學白學了

前言


很多學C語言的人忽略的事兒,0xff + 1=0?數學白學了

整型溢出有點老生常談了,但似乎很多學習C語言的新手都沒有重視。整型溢出會有可能導致緩衝區溢出,緩衝區溢出會導致各種黑客攻擊,比如OpenSSL的heartbleed事件,就是一個buffer overread的事件,希望大家在這裡都能夠了解一下整型溢出。

什麼是整形溢出

C語言的整型問題相信大家並不陌生了。對於整型溢出,分為無符號整型溢出和有符號整型溢出。對於unsigned整型溢出,C的規範是有定義的——“溢出後的數會以2^(8*sizeof(type))作模運算”,也就是說,如果一個unsigned char(1字符,8bits)溢出了,會把溢出的值與256求模。例如:

很多學C語言的人忽略的事兒,0xff + 1=0?數學白學了

上面的代碼會輸出:0 (因為0xff + 1是256,與2^8求模後就是0)

對於signed整型的溢出,C的規範定義是“undefined behavior”,也就是說,編譯器愛怎麼實現就怎麼實現。對於大多數編譯器來說,算得啥就是啥。比如:

很多學C語言的人忽略的事兒,0xff + 1=0?數學白學了

上面的代碼會輸出:-128,因為0x7f + 0x01得到0x80,也就是二進制的1000 0000,符號位為1,負數,後面為全0,就是負的最小數,即-128。(二進制的基本知識哦,視頻教程有講解)

注:signed整型溢出就是負數,這個是不定的,這個就不舉例了,計算方式同上

尾言

如果組下C語言比較差的,二進制都不知道是什麼的同學,不妨關注下小編的專欄視頻教程

通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢,人人都可以學習的C語言課程


分享到:


相關文章: