关于 fwrite 一些东西

· · 科技·工程

灵感来源于这篇题解:[题解]P8423 [THUPC2022 决赛] 想象

猜想

a=1229933126 然后 fwrite(&a, 4, 1, stdout); 输出 FJOI

猜想:这个应该和二进制有关,于是转成二进制得:{\color{#EC4923}0100 \: 1001}\:\color{#00BFFF}{0100 \: 1111} \: {\color{#359697}0100 \: 1010} \: {\color{#945DC4}0100 \: 0110}

稍微验证一下:

\operatorname{char}(01001001_2) = \operatorname{char}(73_{10}) = \text{I} \operatorname{char}(01000110_2) = \operatorname{char}(73_{10}) = \text{F}

发现:a 每八位分一组,从低位到高位把每一组取出并转十进制,刚好是输出字符串的 ASCII 码。

实践

把想输出的字符串的每一个字符转成 ASCII 码,然后丢到一个变量,输出即可。

例:G=71=,a=97,m=109,i=105,n=110,g=103

转成二进制,得:G=0100 0111,a=0110 0001,m=0110 1101,i=0110 1001,n=0110 1110,g=0110 0111

放到一个变量 s=0110 0111 \: 0110 1110 \: 0110 1001 \: 0110 1101 \: 0110 0001 \: 0100 0111

long long s=113723912839495;
fwrite(&s, 8, 1, stdout);  //输出 Gaming

当然,这个输出长度是有限制的,如果想输出更长的还要用多个 fwrite,比如:

typedef unsigned long long ull;
ull a=113723912839495;
ull b=35601528351008;
ull c=133506465689452;
ull d=143771263520;
fwrite(&a,8,1,stdout);
fwrite(&b,6,1,stdout);
fwrite(&c,6,1,stdout);
fwrite(&d,5,1,stdout);

输出 Gaming is a lovely boy!