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/b和a%b计算和优化得很好,减少甚至需要div().建议只执行两个计算,让编译器优化它.
[编辑] 
细节:在C99之前,除法可以截断为0,朝向INT_MIN或(也许可以舍入到最近 - 我将调查那个).无论如何%是分裂后的剩余部分.  div()被指定只做一个:除以截断为0.用C99,两者div()并/用截断为0的商进行除法.
请参阅
div()库函数的用途是什么?
整数除法的行为是什么?