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

#C/C++##算法##研究生#
全部评论
g++ 4.8.5 测试,感觉和编译器优化有关系, 开启O1 优化结果与大佬测试相同,默认无优化结果和未进行右移相同,汇编如图,不是很懂为什么,望解答。
点赞 回复 分享
发布于 2022-10-09 21:13 江苏
看看汇编结果
点赞 回复 分享
发布于 2022-10-07 18:19 北京
测试程序和算法程序在同一台机器上跑的吗?编译器也是相同的?
点赞 回复 分享
发布于 2022-10-07 00:35 江苏

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务