我正在装配(x86)中工作,并且正在使用百分比。我的问题是以下问题:
我有一些值total_sum
代表100%。
我计算total_sum/100
得到代表1%的值:
xorl %edx, %edx
movl total_sum, %eax
movl $100, %ecx
divl %ecx
稍后,在我的程序中,我使用该除法的结果来计算其他值所代表的百分比。
使用计算器(浮点数)完成的示例计算:
515代表100%,506代表什么百分比?
515/100 = 5.15
506 / 5.15 = 98.25这意味着:506代表515的98%。
不幸的是,使用汇编语言和整数算术,计算结果如下:
515/100 = 5
506/5 = 101这意味着506代表515的101%。
但是,我不想结果> 100%。
我正在尝试使用第一级的%edx
中的值进行一些更正。但是,对%eax
进行四舍五入(如果%edx
表示小数点后的第一个数字为5或更大,则递增)没有太大帮助。
如何确保我得到的值不超过100%?
答案 0 :(得分:2)
我完全编辑了您的问题,因为它不容易理解。我希望我完全理解您的问题,而这个问题仍然在问您想问什么。
您描述的问题实际上不是汇编语言问题,而是与任何可以执行整数算术的编程语言(例如C / C ++,Java,Pascal和许多其他语言)相关的问题。
因此,我从您的问题中删除了x86
标签,并添加了integer-division
标签。
以下尝试:
我正在尝试使用第一级的
%edx
中的值进行一些更正。但是,舍入%eax
...并没有太大帮助。
不会帮助您。让我们看一下稍后要执行的第二次计算:
570/5 = 114
570/6 = 95
510/5 = 102
510/6 = 85
因此,如果第一部分的(校正后)结果为5,尽管510 <515,值510仍将被计算为102%。
如果第一部分的(校正后)结果为6,则尽管570> 515,值570仍将被计算为95%。
这意味着不存在表示1%的整数one_percent
,并且在执行操作percentage = number / one_percent
时会给您正确的结果。
您唯一的机会是在程序结尾处执行以下计算 :
percentage = (100 * number) / total_sum
请注意,使用整数算术时,操作顺序确实几乎总是重要的。因此,以下计算不会不给出与上述计算相同的结果:
percentage = 100 * (number / total_sum)
使用汇编语言,您可以通过以下方式进行第一次计算:
mov $100, %edx
mov some_number, %eax
mull %edx
; Now (edx:eax) contains the 64-bit value (100*some_number)
mov total_sum, %ecx
divl %ecx
; Now eax contains the 32-bit value (100*some_number)/total_sum