C++的一个右移运算相关的bug
全天侯直播中
http://live.bilibili.com/23311525
32位无符号数右移32位,在单独的测试程序里结果是0,开了-o3也是0,但是在算法实现里结果却是没有右移
测试程序
unsigned char source_ip[4]; source_ip[0]=111; source_ip[1]=66; source_ip[2]=78; source_ip[3]=128; unsigned char source_ip2[4]; source_ip2[0]=0; source_ip2[1]=0; source_ip2[2]=0; source_ip2[3]=0; cout<<*(unsigned int*)source_ip<<"\n"; cout<<(*(unsigned int*)source_ip>>32)<<"\n"; cout<<((*(unsigned int*)source_ip>>32)==(*(unsigned int*)source_ip2>>32))<<"\n";
输出
2152612463
0
1
可以看到又移32位后确实变成了0
算法实现程序
可以看到,进入了if,打印了3个数,
freebit
表示应该右移的位数,32位
dip
也就是目的ip对应的4个字节从高到低位分别是 221,78,66,111,转换为10进制就是打印出来的那个 3712893551
(11011101,01001110,01000010,01101111),没有右移后变成0,还是原来的数字...