memset(a, -0x3f3f3f3f, sizeof(a));
其实第一个数字并不是-0x3f3f3f3f. hhhh 还是用这个保险
-0x3f3f3f3f
vector<int> a(10, -0x3f3f3f3f);
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)); 完成~~!
是的
厉害,很详实
tql
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));
完成~~!
是的
厉害,很详实
tql