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