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,还是原来的数字...
