これらの4行のトリッキーなCコードの背後にある概念 質問する

これらの4行のトリッキーなCコードの背後にある概念 質問する

このコードが出力を出すのはなぜですか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()

おすすめ記事