打印

C语言如何判断两个数相加是否产生进位

[复制链接]
8787|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
john_light|  楼主 | 2010-3-30 12:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以两个单字节无符号数为例。
在51汇编中,有CY位标志可供判断:
MOV     A, R0
ADD     A, R1
JC      SOMEWHERE
MOV     ...
SOMEWHERE:

在C中,我目前的做法是,定义一个两字节的变量:
unsigned char first;
unsigned char second;
unsigned int sum;

sum = first + second;
if (sum >= 0x100)
{
//bla bla ...
}
else
{
//bla bla ...
}

目前为止,我还是觉得很别扭。
不知道大伙是怎么做的?

相关帖子

沙发
chen3bing| | 2010-3-30 12:33 | 只看该作者
这样可以呀!

使用特权

评论回复
板凳
ejack| | 2010-3-30 12:34 | 只看该作者
本帖最后由 ejack 于 2010-3-30 12:38 编辑

为什么不直接用CY位?
编译器不会笨到连定义的寄存器都不认识的。
不过使用的时候要注意点,有时候优化时编译器会按照优化规则统筹编译,结果可能并非预期。

使用特权

评论回复
地板
john_light|  楼主 | 2010-3-30 13:03 | 只看该作者
为什么不直接用CY位?
编译器不会笨到连定义的寄存器都不认识的。
不过使用的时候要注意点,有时候优化时编译器会按照优化规则统筹编译,结果可能并非预期。 ...
ejack 发表于 2010-3-30 12:34

各种内核的进位标志的访问方法是不一样的,我提出这个问题主要考虑C语言的通用性。

使用特权

评论回复
5
ejack| | 2010-3-30 18:02 | 只看该作者
哦,是说通用的啊
对于标准C来说进位很重要吗?有什么特殊含义吗?

使用特权

评论回复
6
potter| | 2010-3-31 00:13 | 只看该作者
sum定义成uchar.相加后与加数比较,sum小的话就溢出了

使用特权

评论回复
7
john_light|  楼主 | 2010-3-31 08:54 | 只看该作者
sum定义成uchar.相加后与加数比较,sum小的话就溢出了
potter 发表于 2010-3-31 00:13

对,结帖。

使用特权

评论回复
8
highgear| | 2010-3-31 21:54 | 只看该作者
溢出的必要条件:
1. sum 小与 128; sum.7 == 0
2. 加数至少有一个大于 128; (first | second).7 == 1

所以:
unsigned char first;
unsigned char second;
unsigned char sum;

sum = first + second;
if ((sum & 0x80)==0 && ((first | second) & 0x80 != 0) {
bla bla ...

使用特权

评论回复
9
john_light|  楼主 | 2010-4-1 08:58 | 只看该作者
溢出的必要条件:
1. sum 小与 128; sum.7 == 0
2. 加数至少有一个大于 128; (first | second).7 == 1

所以:
unsigned char first;
unsigned char second;
unsigned char sum;

sum = first + second;
if ((sum & ...
highgear 发表于 2010-3-31 21:54

你的说法有误,unsigned char最大可以到0xFF,即255。;P

使用特权

评论回复
10
john_light|  楼主 | 2010-4-1 09:00 | 只看该作者
potter提到的做法如果不加注释,其他人乍看之下可能会云里雾里,却是简洁高效的。:victory:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这是俺在自留地里种的几棵ARM/Linux/MySQL/PHP苗

34

主题

1094

帖子

2

粉丝