网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月24日漏签0天
noip吧 关注:25,172贴子:642,057
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 47回复贴,共2页
  • ,跳到 页  
<<返回noip吧
>0< 加载中...

【申精】C/C++除法实现方式及负数取模详解

  • 只看楼主
  • 收藏

  • 回复
  • 呆兔子tbc
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近在某群中接连有人问到C/C++负数取模的问题,这类问题在NOIP初赛模拟题上也出现过。在此科普一下,大牛直接飘过吧~
2L正式开始,勿插~


  • 呆兔子tbc
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一、下面的题目你能全做对吗?
1.7/4=?
2.7/(-4)=?
3.7%4=?
4.7%(-4)=?
5.(-7)/4=?
6.(-7)%4=?
7.(-7)/(unsigned)4=?
答案:
1
-1
3
3
-1
-3
1073741822
如过你全部答对,你可以无视后面的内容……


2025-08-24 11:23:21
广告
不感兴趣
开通SVIP免广告
  • 呆兔子tbc
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
二、除法的取整分类
除法的取整分为三类:向上取整、向下取整、向零取整。
1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
2.向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
3.向零取整:向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,7/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2
通过观察可以发现,无论是向上取整还是向下取整,(-a)/b==-(a/b)都不一定成立。这给程序设计者带来了极大的麻烦。而对于向零取整,(-a)/b==-(a/b)是成立的,以此,C/C++采用这种取整方式。


  • 呆兔子tbc
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
三、负数取模
回想小学的公式:被除数÷除数=商……余数。
由此可知,余数=被除数-商×除数 (*)
对C/C++而言,(*)式依然成立。并且,该式是解决负数取模问题的关键。
例一:7%(-4)=?
解:由C/C++向零取整的整除方式可知,7/(-4)=-1;由(*)式知,余数=7-(-4)*(-1)=3.所以,7%(-4)=3
例二:(-7)%4=?
解:由C/C++向零取整的整除方式可知,(-7)/4=-1;由(*)式知,余数=(-7)-4*(-1)=-3.所以,(-7)%4=-3
例三:(-7)%(-4)=?
解:由C/C++向零取整的整除方式可知,(-7)/(-4)=1;由(*)式知,余数=(-7)-(-4)*1=-3.所以,(-7)%(-4)=-3


  • 呆兔子tbc
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
以【变量/2^3】为例,反汇编代码如下:
mov eax,被除数
cdq ;若eax<0,则edx=0xFFFFFFFF;否则edx=0
and edx,7 ;若eax<0,则edx=7;否则edx=0
add eax,edx ;若eax<0,【(eax+7)/(2^3)】向下取整的值 与 【eax/(2^3)】向零取整的值相等,从而实现向零取整
sar eax,3 ;右移,完成除法
②在“O2优化”条件下,“常量/变量”型除法中,常量若≠2^n,也可以优化。此时,除法将被转换为乘法与右移的结合形式。例如,a/b=a*(1/b)=a*((2^n)/b)*(1/(2^n)),其中,((2^n)/b为MagicNumber,由编译器在编译过程中算出。这样a/b就变成了(a*MagicNumber)>>n,n的值由编译器选取。需要注意的是,本公式只是除法优化中的一个典型代表,编译器会根据除数对公式进行调整,但基本形式与原理是类似的。


  • yoso_so
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
近距离ORZ,发完了麽,这不算插楼吧。。


  • jokxurwq
  • 进队爷
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
orz


  • 呆兔子tbc
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
完了。。


2025-08-24 11:17:21
广告
不感兴趣
开通SVIP免广告
  • wyl8899
  • NOI金牌
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ym!
直觉对了前面6个我果然去面壁吧


  • jokxurwq
  • 进队爷
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
LZ的汇编代码应该是用VC产生的……我来发个gcc -S产生的汇编代码,结果是一样的
movl 被除数, %eax
leal 7(%eax), %edx /* edx=eax+7; */
testl %eax, %eax /* 判断eax的状态,供下一行使用 */
cmovs %edx, %eax /* if (eax<0) eax=edx; */
sarl $3, %eax /* eax>>=3; */



  • 嗜血魂K
  • 怒进省队
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
orz大牛 mark下。。。。。。15字15字


  • 农村少先队员
  • NOI银牌
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我只知道*S*B*的C编译器竟敢和数学在负数mod上不保持一致


  • XGHeaven
  • 怒进省队
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
orz


  • 未曾完的故事
  • 普及一等
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Orz...果断膜拜


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 47回复贴,共2页
  • ,跳到 页  
<<返回noip吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示