使用带无符号整数的div

时间:2015-08-28 21:47:49

标签: c++ c division

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无法解决问题。

2 个答案:

答案 0 :(得分:10)

当天回来,/%的结果并非由C唯一定义,div()诞生了。现在/的商被截断为0。

unsigned数学没有这个问题,因此对udiv()的需求较少。

现在,许多编译器都能识别出附近的a/ba%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加到结果中。

但是你可以简单地使用除法运算符/