请问下列两个宏的区别

xxxl 2014-10-24 10:15:16
在《C接口与实现》看到了宏1,为什么不写成宏2呢?

1、#define nbytes(len) ((((len) + 8 - 1)&(~(8-1)))/8)

2、#define nbytes(len) ((((len) + 8 - 1))/8)

我感觉两个宏的结果没有区别啊,难道效率上不同?

求解答,谢谢!
...全文
254 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fztfztfzt 2014-10-24
  • 打赏
  • 举报
回复
引用 1 楼 Saleayas 的回复:
因为 & 运算对机器来说比较简单啊。
引用 2 楼 u011779875 的回复:
计算机中只有加法 减一个数即加上他的反码 通过减来使现除法 而加法实现根据基本的与 或 非 逻辑运算 实现 所有 &运算快于/
第一个宏是把&的结果/8 第二个是直接/8 是这2个的区别
做或不做 2014-10-24
  • 打赏
  • 举报
回复
问题变成 一条add指令 和俩条and指令的比较
做或不做 2014-10-24
  • 打赏
  • 举报
回复
看俩段汇编代码 key = ((((len) + 8 - 1)&(~(8-1)))/8); 000E1A4C mov eax,dword ptr [len] 000E1A4F add eax,7 000E1A52 and eax,0FFFFFFF8h 000E1A55 cdq 000E1A56 and edx,7 000E1A59 add eax,edx 000E1A5B sar eax,3 000E1A5E mov dword ptr [key],eax key=((((len) + 8 - 1))/8); 008C1A4C mov eax,dword ptr [len] 008C1A4F add eax,7 008C1A52 cdq 008C1A53 and edx,7 008C1A56 add eax,edx 008C1A58 sar eax,3 008C1A5B mov dword ptr [key],eax
做或不做 2014-10-24
  • 打赏
  • 举报
回复
计算机中只有加法 减一个数即加上他的反码 通过减来使现除法 而加法实现根据基本的与 或 非 逻辑运算 实现 所有 &运算快于/
Saleayas 2014-10-24
  • 打赏
  • 举报
回复
因为 & 运算对机器来说比较简单啊。
做或不做 2014-10-24
  • 打赏
  • 举报
回复
看错了 效率是第二条 比第一条快 少了条000E1A52 and eax,0FFFFFFF8h 可能如楼上所说 是为了留着以后的扩展问题吧
FancyMouse 2014-10-24
  • 打赏
  • 举报
回复
负数两个就有区别了。这就是为什么asm里有cdq指令 不过这个宏本身该不该用在负数上那是另一回事
赵4老师 2014-10-24
  • 打赏
  • 举报
回复
#include <stdio.h>
#define nbytes1(len) ((((len) + 8 - 1)&(~(8-1)))/8)
#define nbytes2(len) ((((len) + 8 - 1))/8)
int main() {
    int L;

    for (L=-17;L<=17;L++) {
        printf("%4d %3d %3d\n",L,nbytes1(L),nbytes2(L));
    }
    return 0;
}
// -17  -2  -1
// -16  -2  -1
// -15  -1  -1
// -14  -1   0
// -13  -1   0
// -12  -1   0
// -11  -1   0
// -10  -1   0
//  -9  -1   0
//  -8  -1   0
//  -7   0   0
//  -6   0   0
//  -5   0   0
//  -4   0   0
//  -3   0   0
//  -2   0   0
//  -1   0   0
//   0   0   0
//   1   1   1
//   2   1   1
//   3   1   1
//   4   1   1
//   5   1   1
//   6   1   1
//   7   1   1
//   8   1   1
//   9   2   2
//  10   2   2
//  11   2   2
//  12   2   2
//  13   2   2
//  14   2   2
//  15   2   2
//  16   2   2
//  17   3   3
//
mymtom 2014-10-24
  • 打赏
  • 举报
回复
貌似结果没有区别呀!

70,020

社区成员

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

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