2的0次方 64位2进制表示就是 0000 ... 0001(0次方时这个1的位置是从右往左数第1个位置);
此时 sum = 0000 ... 0000 + 0000 ... 0001 = 0000 ... 0000;
2的1次方 64位2进制表示就是 0000 ... 0010(1次方时这个1的位置是从右往左数第2个位置);
此时 sum = 0000 ... 0001 + 0000 ... 0010 = 0000 ... 0011;
2的2次方 64位2进制表示就是 0000 ... 0100(2次方时这个1的位置是从右往左数第3个位置);
此时 sum = 0000 ... 0011 + 0000 ... 0100 = 0000 ... 0111;
.
.
.
2的63次方 64位2进制表示就是 1000 ... 0000(63次方时这个1的位置是从右往左数第64个位置);
此时 sum = 0111 ... 1111 + 1000 ... 0000 = 1111 ... 1111;
在long long int 中 1111 ... 1111 表示的值是 -1(这个去了解符数的2进制) , -1 / 25000 = 0(所以weight的值是0)
printf中 %llu是以unsigned long long的方式打印所以 sum 1111 ... 1111 在long long中是-1, 在unsigned long long中就变成了2的64次方, weight本身就是0 从long long转换成 unsigned long long 还是0
(希望能对你有帮助)