c语言负数除法运算过程,C语言负数的除法和求余运算
假定我們讓 a 除以 b,商為 q,余數(shù)為 r: q = a / b;
r = a % b;
這里,不妨假定 b 大于 0。
我們希望 a、b、q、r 之間維持怎樣的關(guān)系呢?
1.最重的一點(diǎn),我們希望 q * b + r == a,因?yàn)檫@是定義余數(shù)的關(guān)系。
2.如果我們改變 a 的正負(fù)號(hào),我們希望這會(huì)改變 q 的符號(hào),但這不會(huì)改變 q ?的絕對(duì)值。
3.當(dāng) b>0 時(shí),我們希望保證 r >= 0 且 r < b。例如,如果余數(shù)用于哈希表的索引,確保 它是一個(gè)有效的索引值很重 。
這三條性質(zhì)是我們認(rèn)為整數(shù)除法和余數(shù)操作所應(yīng)該具備的。很不幸的是,它們不可能同時(shí)成立。
考慮一個(gè)簡單的例子:3/2,商為 1,余數(shù)也為 1。此時(shí),第 1 條性質(zhì)得到了滿足。(-3)/2 的值應(yīng)該是多少呢?如果 滿足第 2 條性質(zhì),答案應(yīng)該是-1,但如果是這樣,余數(shù)就必定是-1,這樣第 3 條性質(zhì)就無法滿足了。如果我們首先滿足第 3 條性質(zhì),即余數(shù)是 1,這種情況下根據(jù)第 1 條性質(zhì)則商是-2,那么第 2 條性質(zhì)又無法滿足了。
因此,C 語言或者其他語言在實(shí)現(xiàn)整數(shù)除法截?cái)噙\(yùn)算時(shí),必須放棄上述三條原則中的至 少一條。大多數(shù)程序設(shè)計(jì)語言選擇了放棄第 3 條,而改為 求余數(shù)與被除數(shù)的正負(fù)號(hào)相同。 這樣,性質(zhì) 1 和性質(zhì) 2 就可以得到滿足。大多數(shù) C 編譯器在實(shí)踐中也都是這樣做的。
然而,C 語言的定義只保證了性質(zhì) 1,以及當(dāng) a>=0 且 b>0 時(shí),保證|r| < |b|以及 r>=0。 后面部分的保證與性質(zhì) 2 或者性質(zhì) 3 比較起來,限制性 弱得多。
C 語言的定義雖然有時(shí)候會(huì)帶來不需 的靈活性,但大多數(shù)時(shí)候,只要編程者清楚地知道要做什么、該做什么,這個(gè)定義對(duì)讓整數(shù)除法運(yùn)算滿足其需要來說還是夠用了的。例如,
假定我們有一個(gè)數(shù) n,它代表標(biāo)識(shí)符中的字符經(jīng)過某種函數(shù)運(yùn)算后的結(jié)果,我們希望通過除 法運(yùn)算得到哈希表的條目 h,滿足 0<=h
h=n%HASHSIZE:
然而,如果 n 有可能為負(fù)數(shù),而此時(shí) h 也有可能為負(fù),那么這樣做就不一定總是合適 的了。不過,我們己知 h>-HASHSIZE,因此我們可以這樣寫:
h = n % HASHSIZE;
if(n < 0)
h += HASHSIZE;
更好的做法是,程序在設(shè)計(jì)時(shí)就應(yīng)該避免 n 的值為負(fù)這樣的情形,并且聲明 n 為無符號(hào)數(shù)。
測試代碼:
#include
main()
{
int a=-, b=;
int q,r;
q = a / b;
r = a % b;
printf("q=%d, r=%d\n", q, r);
}
Swift 求余運(yùn)算
求余運(yùn)算 求余運(yùn)算(a % b)是計(jì)算b的多少倍剛剛好可以容入a,返回多出來的那部分(余數(shù)). 注意:求余運(yùn)算(%)在其他語言也叫取模運(yùn)算.然而嚴(yán)格說來,我們看該運(yùn)算符對(duì)負(fù)數(shù)的操作結(jié)果,"求 ...
java 整除(/) 求余(%) 運(yùn)算
1. java 整除(/)? 求余(%)? 運(yùn)算 1.求余??? System.out.println(11%2);???? //顧名思義就是11除2的余數(shù)-->1??? System.out. ...
PHP:第一章——按位運(yùn)算和求余運(yùn)算(判斷奇偶數(shù))
051-PHP求余運(yùn)算
和求余運(yùn)算巧妙結(jié)合的jns指令
.text:004A78B1 ?and eax, 80000001h.text:004A78B6 ?jns short loc_4A78BD.text:004A78B8 dec eax.text:00 ...
Sicily1020-大數(shù)求余算法及優(yōu)化
Github最終優(yōu)化代碼:?https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1020.c 題目如下: 1020. ...
Verilog求余
在實(shí)現(xiàn)三角函數(shù)時(shí),考慮到函數(shù)的周期性,綜量(自變量)需對(duì)周期做求余運(yùn)算. 假設(shè)函數(shù)周期為T = 2^N,那么求余運(yùn)算就是直接取該數(shù)的低N位,即: 以M位正數(shù)為例(符號(hào)位為0),reg [M-1:0] ...
java學(xué)習(xí)--高效的除模取余運(yùn)算(n-1)&;hash
沒有測試過使用取余運(yùn)算符和位運(yùn)算符都做同一件事時(shí)的時(shí)間效率! 取余運(yùn)算符% 如3除以2取余數(shù) a = a%; 結(jié)果為1 上面是傳統(tǒng)的方式進(jìn)行求余運(yùn)算. 需要先將10進(jìn)制轉(zhuǎn)成2進(jìn)制到內(nèi)存中進(jìn)行計(jì)算,然后 ...
C語言 負(fù)數(shù)取余的原理
負(fù)數(shù)求余數(shù)運(yùn)算是一個(gè)數(shù)學(xué)問題: 任何一個(gè)整數(shù)n都可以表示成 n=k*q+r 其中0<=|r|
隨機(jī)推薦
如何一步一步用DDD設(shè)計(jì)一個(gè)電商網(wǎng)站(四)—— 把商品賣給用戶
閱讀目錄 前言 怎么賣 領(lǐng)域服務(wù)的使用 回到現(xiàn)實(shí) 結(jié)語 一.前言 上篇中我們講述了“把商品賣給用戶”中的商品和用戶的初步設(shè)計(jì).現(xiàn)在把剩余的“賣”這個(gè)動(dòng)作給做了.這里提醒一下,正常情況下,我們的每一步業(yè) ...
win10 64位專業(yè)版系統(tǒng)中顯示32位dcom組件配置的方法
word.excel是32位的組件,當(dāng)用戶64位系統(tǒng)在運(yùn)行窗口中輸入dcomcnfg命令時(shí),在打開的組件服務(wù)管理窗口,是找不到Microsoft?Excel.word程序的.另外,Windows?環(huán)境 ...
新浪微博頂部新評(píng)論提示層效果——position:fixed
總結(jié)
以上是生活随笔為你收集整理的c语言负数除法运算过程,C语言负数的除法和求余运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新可用快手极速版自动阅读薅羊毛auto
- 下一篇: Quartus II 11.0 破解补丁