请大家帮我看一下这个宏定义

liarking 2005-12-01 09:37:11
#define CALC_SUMD(s1, s2, sd) { \
(s1) = ((s1) & 0xffff) + ((s1) >> 16); \
(s2) = ((s2) & 0xffff) + ((s2) >> 16); \
/* Do it twice */ \
(s1) = ((s1) & 0xffff) + ((s1) >> 16); \
(s2) = ((s2) & 0xffff) + ((s2) >> 16); \
/* Because ~1 == -2, We really need ~1 == -1 */ \
if ((s1) > (s2)) (s2)--; \
(sd) = (s2) - (s1); \
(sd) = ((sd) & 0xffff) + ((sd) >> 16); }
...全文
279 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
RainWindy 2005-12-01
  • 打赏
  • 举报
回复
(s1) = ((s1) & 0xffff) + ((s1) >> 16); // s1为long型,则取高2字节的值加上低2字节的值
(s2) = ((s2) & 0xffff) + ((s2) >> 16); // 同理
/* Do it twice */
(s1) = ((s1) & 0xffff) + ((s1) >> 16);
(s2) = ((s2) & 0xffff) + ((s2) >> 16);

// 再计算一次,目的是尽量使最后的值的高2字节为0即<0x0000ffffL


/* Because ~1 == -2, We really need ~1 == -1 */

if ((s1) > (s2)) (s2)--; // 更小的数减1

(sd) = (s2) - (s1); // 两数之差

(sd) = ((sd) & 0xffff) + ((sd) >> 16); } // 同理

不知道是什么作用。
以下是我测试时用的:
#include <stdio.h>
#include <stdlib.h>
#define CALC_SUMD(s1, s2, sd) { \
(s1) = ((s1) & 0xffff) + ((s1) >> 16); \
(s2) = ((s2) & 0xffff) + ((s2) >> 16); \
/* Do it twice */ \
(s1) = ((s1) & 0xffff) + ((s1) >> 16); \
(s2) = ((s2) & 0xffff) + ((s2) >> 16); \
/* Because ~1 == -2, We really need ~1 == -1 */ \
if ((s1) > (s2)) (s2)--; \
(sd) = (s2) - (s1); \
(sd) = ((sd) & 0xffff) + ((sd) >> 16); }

void main(int argc, char* argv[])
{
long s1 = 10000L;
long s2 = 20000L;
long sd = 0;

if (argc > 2)
{
s1 = atol(argv[1]);
s2 = atol(argv[2]);
}

CALC_SUMD(s1, s2, sd);

printf("sd:%ld\n", sd);
}
cunsh 2005-12-01
  • 打赏
  • 举报
回复
如果宏里函数的参数没有括号.当参数是一个表达式的时候.宏展开以后就乱了.
#define f(x,y) x * y

如果没括号.f(1+2,4) 就成了 1 + 2*4 等于 9. 而不是12
liarking 2005-12-01
  • 打赏
  • 举报
回复
我是楼主,谢谢楼上的解答
s1,s2这些变量加括号是什么意思?
为什么要重复运算一次?
能详细点说一下这个函数的意义吗?
谢谢!!!!!!
屋顶上的老猫 2005-12-01
  • 打赏
  • 举报
回复
定义了一个函数,进行位运算!上面不是有注释吗!
lzp229 2005-12-01
  • 打赏
  • 举报
回复
就是字符替换。
有什么问题么
liarking 2005-12-01
  • 打赏
  • 举报
回复
第一次提问,自己先顶一下
希望高手帮我解释一下这个宏的功能

69,373

社区成员

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

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