C语言有符号整数加法,溢出判断?

csoma 2012-09-02 10:23:28
《C安全编码标准》
第5章 整数
INT32-C 保证有符号整数运算不会产生溢出






//书中用si1表示x。 si2表示y。

//加法

signed int x,y,sum;
if (((x^y) |(((x(~(x^y)&(1<<(sizeof(int)*CHAR_-1))))+y)^y))>=0) //详细解释下这个条件?
{
}
else
{
sum=x+y;
}


---------------------------------------------------------------------------------------------

问题:
一, 溢出的条件,是什么意思?
详细解释下。

二,书本为什么只是符号整数的加法,无符号整数的加法怎样防止溢出?
...全文
1254 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
csoma 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

1. 无符号整数溢出很好判断, x + y < x 就表示溢出了.
2. 你的代码有语法错误, 有符号数溢出判断方法如下, 可以对比下你的代码:
(1). 符号不同的数相加肯定不会溢出.
(2). 符号相同的数相加, 结果与相加的数符号不同, 则表示溢出.
[/Quote]

1.无符号整数相加,有两个方法不会产生回绕:
方法一:


unsigned int x,y,z;
if (UINT_MAX-x<y)
回绕
else
z=x+y;



方法二:


unsigned int x,y,z;
if (UINT_MAX-y<x)
回绕
else
z=x+y;



对否?

二,给个程序说明下。
csoma 2012-09-03
  • 打赏
  • 举报
回复
加法运算,两操作数,及结果的变量声明都是用符号整数的原因:

一,是为了防止两数相加时,符号位参加了运算,会发生不可预测的结果。对否?

二,加法表达式的两个操作数,及结果。都声明为符号整数,防止了这种现象发生,对否?



www_adintr_com 2012-09-03
  • 打赏
  • 举报
回复
1. 无符号整数溢出很好判断, x + y < x 就表示溢出了.
2. 你的代码有语法错误, 有符号数溢出判断方法如下, 可以对比下你的代码:
(1). 符号不同的数相加肯定不会溢出.
(2). 符号相同的数相加, 结果与相加的数符号不同, 则表示溢出.
csoma 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

无符号整数没有溢出, 溢出是有符号数的专利

检查 cpu 的状态标志寄存器中的溢出标志位
[/Quote]

溢出与截取,这两个概念有什么不同?

有溢出才会有截取,对否?

AnYidan 2012-09-03
  • 打赏
  • 举报
回复
无符号整数没有溢出, 溢出是有符号数的专利

检查 cpu 的状态标志寄存器中的溢出标志位
赵4老师 2012-09-03
  • 打赏
  • 举报
回复
//有符号整形a和b,如何判断a+b是否溢出
#include <stdio.h>
int ifo_add(int a,int b) {
__asm {
mov eax,a
add eax,b
jo overflowed
xor eax,eax
jmp no_overflowed
overflowed:
mov eax,1
no_overflowed:
}
}
int main() {
int a,b;

a= 1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a= -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
}
// 1+( 2) 0
// -1+(-2) 0
// 2147483647+( 1) 1
//-2147483647+(-1) 0
//-2147483647+(-2) 1
csoma 2012-09-02
  • 打赏
  • 举报
回复
if(条件)

这个条件表达式,各个子表达式,逐一详细解释下?

如:
(sizeof(int)*CHAR_-1),是什么意思?有什么作用?
(1<<(sizeof(int)*CHAR_-1)),是什么意思?有什么作用?
......
Gloveing 2012-09-02
  • 打赏
  • 举报
回复
很多时候,溢出是没法防止的,
对于机器来说,没有溢出的概念,他认为都是正确的
溢出只是人的主观感受。。呵呵

69,373

社区成员

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

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