AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

memset 与 -0x3f3f3f3f

作者: 作者的头像   Sherry_ ,  2019-07-27 20:22:29 ,  所有人可见 ,  阅读 2448


5


3
memset(a, -0x3f3f3f3f, sizeof(a)); 

其实第一个数字并不是-0x3f3f3f3f. hhhh
还是用这个保险

vector<int> a(10, -0x3f3f3f3f);

4 评论


用户头像
达启睿   2019-07-29 10:29         踩      回复

emm…
科普一下,memset是以一个字节为单位赋值的,比如以char为例:
char a; //一个字节是8个二进制
memset(a,87,sizeof(a)); //87的二进制是1010111,前面补零之后为01010111
因此一个char从00000000 -> 01010111
但是如果是负数,比如-87,那么它的二进制是87的反码加补码:
01010111 (加符号位)-> 11010111 (转反码)-> 10101000 (加补码)-> 10101001
因此10101001是-87
然后咱们看看-0x3f3f3f3f
0x3f3f3f3f -> 00111111001111110011111100111111
可得-0x3f3f3f3f的二进制:
00111111001111110011111100111111 -> 10111111001111110011111100111111 -> 11000000110000001100000011000000 -> 11000000110000001100000011000001
所以-0x3f3f3f3f -> 11000000110000001100000011000001
最后一个补码可以删掉:11000000110000001100000011000000
发现每8位循环一次11000000,经过查询11000000所对应的十六进制,可以发现:
11000000 -> 0xc0
因为int是32位符号整形,所以32/8=4有4个字节循环,可得-0x3f3f3f3f约等于0xc0c0c0c0
因为memset是逐字节赋值,可以得到代码:
memset(a,0xc0,sizeof(a));
完成~~!

用户头像
Sherry_   2019-07-29 21:36         踩      回复

是的

用户头像
ノ   2019-08-02 15:23         踩      回复

厉害,很详实

用户头像
迷弟   2020-09-27 21:53         踩      回复

tql


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息