2017-05-07 59 views
0

在我的程序中,我試圖計算兩個整數的平均值,然後舍入數字。例如,如果平均值爲-22.5,則它將舍入到-23。 validInputs是從用戶收集到的有效輸入的數量,並且始終爲正整數,而validSum將始終爲負整數,因爲它僅添加負整數。但是,當比較餘數時,我沒有得到正確的舍入結果,並且想知道爲什麼。MASM - 舍入整數

編輯:我建議更改爲-5,但仍然遇到同樣的錯誤。我相信我的錯誤肯定是一個合乎邏輯的問題。

mov  eax, validSum 
cdq 
mov  ebx, validInputs 
idiv ebx 
mov  validAverage, eax 
mov  intRemainder, edx 
cmp  edx, -5 ; compare the remainder to -5 
jg  display ; if greater than -5 we know not to round/decrement 
dec  validAverage 
+0

如果您在調試器通過代碼加強你會注意到其餘的是負面的。你的代碼不處理這種情況。 –

回答

1

如果您只是除以2,解決方案很容易。 IDIV讓你在這種情況下,只有三種可能的餘數:{} -1,0.1這意味着:

  • -1:總和爲負值,小數點後面的數字爲-0.5,平均必須是減1,即avg = avg + (-1)

  • 0:無餘數,平均值已經正確舍入,即avg = avg + 0

  • 1:總和爲正值,餘數爲0.5,必須加1,即avg = avg +1

正如你所看到的,有沒有必要長篇大論的比較,你可以添加其餘EDXEAX

; Only valid for EBX=2 
mov  eax, validSum 
cdq         ; EAX -> EDX:EAX 
mov  ebx, validInputs 
idiv ebx       ; EDX:EAX/EBX -> EAX remainder EDX 
mov  validAverage, eax   ; Save result 
add  validAverage, edx   ; Add -1 or 0 or 1 
jmp  display      ; End of Rounding 

除此之外,其餘無關用十進制數的小數部分。這是完全錯誤的,直接與5或-5進行比較。你必須先得到第一個小數位。在一個長分區中,最後「加」一個0,然後除以除數。同樣在這裏:乘以十(=結尾加0)除以EBX。現在,您可以通過5劃分結果獲得三重如上:{} -1,0.1

... 
idiv ebx       ; EDX:EAX/EBX 
mov  validAverage, eax   ; Save result 

mov eax, edx 
add eax, eax      ; A quick way to multiply by 10 
lea eax, [eax + eax * 4]   ; EAX * 10 = EAX * 2 + EAX * 8 
cdq         ; EAX -> EDX:EAX 
idiv ebx       ; EDX:EAX/EBX -> EAX remainder EDX 
mov ebx, 5 
cdq         ; EAX -> EDX:EAX 
idiv ebx 
add validAverage, eax    ; Add -1 or 0 or 1 
jmp  display      ; End of Rounding 

您可以將EAX*10/EBX/5EAX*2/EBX

mov  eax, validSum 
cdq         ; EAX -> EDX:EAX 
mov  ebx, validInputs 
idiv ebx       ; EDX:EAX/EBX -> EAX remainder EDX 
mov  validAverage, eax   ; Save result 

imul eax, edx, 2     ; EAX = EDX * 2 
cdq         ; EAX -> EDX:EAX 
idiv ebx       ; EDX:EAX/EBX 
add validAverage, eax    ; Add -1 or 0 or 1 

jmp display       ; End of Rounding