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 江苏

相关推荐

01-15 13:45
门头沟学院 Java
牛客92772631...:boss招聘挂岗位是要花钱的,花了钱不挂白不挂,别那么焦虑,但是也要做好跳槽的准备
找实习记录
点赞 评论 收藏
分享
合适才能收到offe...:项目岗是什么岗?我看你有段好像跟策划运营相关,如果找运营的话第三段经历写详细点儿。 个人建议是把自我评价删了换成专业技能放在工作经验上或者下面。学生会那个也可以删,把第一个包装成店铺运营,写4-6给点。第三个也是写4-6个点。注意工作内容➕部分数据。 投递的时候BOS招呼用语改一下,换成我有xx工作经验,熟练掌握xx技能样式,也可以简历截图然后直接发送。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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