使用带无符号整数的div

cas*_*avo 7 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 ints,所以使用lldiv并不能解决问题.

chu*_*ica 11

回到白天,C的结果/%没有被C唯一定义并且div()诞生了.现在,商从/被截断为0.

unsigned数学没有这个问题,因此需要较少udiv().

现在很多的编译器识别附近a/ba%b计算和优化得很好,减少甚至需要div().建议只执行两个计算,让编译器优化它.


[编辑]
细节:在C99之前,除法可以截断为0,朝向INT_MIN或(也许可以舍入到最近 - 我将调查那个).无论如何%是分裂后的剩余部分. div()被指定只做一个:除以截断为0.用C99,两者div()/用截断为0的商进行除法.

请参阅
div()库函数的用途是什么?
整数除法的行为是什么?