很多学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语言课程


分享到:


相關文章: