このコードが出力を出すのはなぜですかC++Sucks
? その背後にある概念は何ですか?
#include <stdio.h>
double m[] = {7709179928849219.0, 771};
int main() {
m[1]--?m[0]*=2,main():printf((char*)m);
}
試してここ。
ベストアンサー1
この数値は7709179928849219.0
、64 ビットとして次のバイナリ表現を持ちますdouble
。
01000011 00111011 01100011 01110101 01010011 00101011 00101011 01000011
+^^^^^^^ ^^^^---- -------- -------- -------- -------- -------- --------
+
^
符号、指数、-
仮数(つまり指数のない値)の位置を示します。
表現には 2 進数の指数と仮数が使用されるため、数を 2 倍にすると指数が 1 増加します。プログラムではこれを正確に 771 回実行するので、1075 ( の 10 進表現10000110011
) で始まる指数は、最終的に 1075 + 771 = 1846 になります。1846 の 2 進表現は です11100110110
。結果のパターンは次のようになります。
01110011 01101011 01100011 01110101 01010011 00101011 00101011 01000011
-------- -------- -------- -------- -------- -------- -------- --------
0x73 's' 0x6B 'k' 0x63 'c' 0x75 'u' 0x53 'S' 0x2B '+' 0x2B '+' 0x43 'C'
このパターンは、印刷される文字列に相当しますが、逆順に並べたものです。同時に、配列の 2 番目の要素はゼロになり、ヌル終端文字が提供され、文字列が に渡されるのに適したものになりますprintf()
。