无符号整数运算回绕?

csoma 2012-09-08 08:44:09
《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),但表达式的结果可能太大,保存不了!
这样就会回绕。
什么是回绕?回绕的结果也对?

...全文
622 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
辰岡墨竹 2012-09-08
  • 打赏
  • 举报
回复
就是这样的,当初8086设计的时候,就是设计成这个样子的整数模型。整数发生回绕,除了会有进位标志外,不会发生任何CPU异常。
当时的确有些程序利用了这个特性,不过现在来说一般建议避免,因为其他架构的CPU,发生整数溢出时可能会触发CPU异常。
csoma 2012-09-08
  • 打赏
  • 举报
回复
说说回绕的原理?
为什么结果回绕,也对呢?
AnYidan 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
u_char a = 0xff;
printf( "a = %d\n", a );
a += 1;
printf( "a = %d\n", a );

这就产生回绕
[/Quote]

printf( "a = %u\n", a );
csoma 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

循环进位么
[/Quote]

给个实例解释下!
AndyZhang 2012-09-08
  • 打赏
  • 举报
回复
循环进位么
csoma 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

u_char a = 0xff;
printf( "a = %d\n", a );
a += 1;
printf( "a = %d\n", a );

这就产生回绕
[/Quote]

什么是回绕?
为什么回绕的结果也对?
说说原理?
xuie0000 2012-09-08
  • 打赏
  • 举报
回复
u_char a = 0xff;
printf( "a = %d\n", a );
a += 1;
printf( "a = %d\n", a );

这就产生回绕

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧