首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

无符号整数演算回绕

2012-09-23 
无符号整数运算回绕?《C安全编码标准》第5章 整数INT30-C 保证无符号整数运算不产生回绕涉及到无符号操作数

无符号整数运算回绕?
《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异常。

热点排行