C ++标准提供div(int,int),但不提供udiv(unsigned int,unsigned int)。
如果我天真地在这个函数中使用无符号整数,我可以看到这会对分子中大于2 ^ 31 - 1的整数产生错误的结果。例如(带有4位半字节):
最大的4位半字节是15,1111二进制。作为有符号的半字节,这将代表-1。将15除以2得到7或0111,但将-1除以2得到0:0000。
有没有一种简单的方法可以将div调整为无符号整数,还是我最好编写自己的udiv,或者完全避免使用div和div类函数?
编辑/注意:就我而言,我正在使用unsigned long long int
,因此使用lldiv无法解决问题。
答案 0 :(得分:10)
当天回来,/
和%
的结果并非由C唯一定义,div()
诞生了。现在/
的商被截断为0。
unsigned
数学没有这个问题,因此对udiv()
的需求较少。
现在,许多编译器都能识别出附近的a/b
和a%b
计算并进行了很好的优化,从而减少了对div()
的需求。建议只执行两个计算并让编译器对其进行优化。
[编辑]
细节:在C99之前,除法可能会向INT_MIN
方向截断0,或者(可能可以舍入到最近 - 我会查看它)。无论如何%
是除法后的余数。 div()
被指定为仅执行一次:使用截断值朝0进行除法。对于C99,div()
和/
执行除法,并将商截断为0。
请参阅
What is purpose of the div() library function?
What is the behavior of integer division?
答案 1 :(得分:0)
假设你有一个n个字节的整数,你可以存储k = 2 ^ n个数字,所以如果你有一个负数,那么将它的值作为无符号就可以将k添加到它。
所以你可以做的是,测试数字是否为negatif,将k / q加到结果中。
但是你可以简单地使用除法运算符/