(1)比如 7 / 2 = 3 …… 1 -7 / 2= -3 …… -1
比较重要的是,余数的绝对值小于除数的绝对值,并且余数和被除数同正负
(2)由于 C语言 中除法是向0取整,也就是“截断除法”
不难发现,正数除以正数时,截断除法相当于向下取整(3.5 -> 3);而负数除以正数时,截断除法相当于向上取整( -3.5 -> -3 )
(3)除以2的k次幂通常会被优化成右移k位,这里考虑除以2时
用一个signed byte表示7,是00000111,右移一位变成00000011是3,是正确的
但是,考虑-7/2,-7是11111001,右移一位后变成11111100,这是-4,因为这是向下取整的结果,所以比正确的答案 -3少了1
代码中为了统一和效率,如果是32位的数字,会先右移31位扩展符号位。原先是正数则最高位是0,那么最后会变成32个0,也就是0,;原先是负数最高位是1,最后会变成32个1,也就是-1,暂且把这个扩展符号位后形成的数记作S,
那么,我们只需要把右移一位的结果,减去这个S,就可以得到正确的截断除法的值
7/2 = 7>>1 –(0) = 3 -7/2 =-7>>1 – (-1)= -3
(这一点在例题代码中会再次提到)
(4)当除以正数N,而N不是2的次幂时,编译器会生成一个magic_number(C),以使除法优化成乘法,提高