无符号整数运算回绕?
《C安全编码标准》
第5章 整数
INT30-C 保证无符号整数运算不产生回绕
涉及到无符号操作数的计算不会溢出,因为无法由最终的无符号整数类型表示的结果,将会根据这种最终类型可以表示的最大值加1执行求模操作。
这个行为更通俗的说法是无符号整数将会回绕。
-------------------------------------------------------
问题:
一,无符号整数,它的范围是>=0。
无符号整数就是正整数,对否?
如: 32位计算机
unsigned int 的范围:0~4294967295。都是正数!
二,无符号整数运算,是指两个操作数都是无符号整数(也就是两个正数),对否?
如: unsigned int x=3u , y=777777u , z;
z=x+y;
在变量定义时,常量加u,保证常量是无符号整数(也就是正数),对否?
三,两个无符号整数(正数)运算,有没有溢出?
四,“因为无法由最终的无符号整数类型表示的结果,将会根据这种最终类型可以表示的最大值加1执行求模操作。”
这句话的意思是:
结果是保存在无符号整数类型中(实例 z ,它声明的类型是:unsigned int),但表达式的结果可能太大,保存不了!
这样就会回绕。
什么是回绕?回绕的结果也对?
[解决办法]
就是这样的,当初8086设计的时候,就是设计成这个样子的整数模型。整数发生回绕,除了会有进位标志外,不会发生任何CPU异常。
当时的确有些程序利用了这个特性,不过现在来说一般建议避免,因为其他架构的CPU,发生整数溢出时可能会触发CPU异常。