1. ホーム
  2. c

[解決済み] この4行のトリッキーなC言語のコードの背後にある概念

2022-03-26 06:40:59

質問

なぜこのコードは出力を与えるのでしょうか C++Sucks ? また、その背景にはどのような考え方があるのでしょうか?

#include <stdio.h>

double m[] = {7709179928849219.0, 771};

int main() {
    m[1]--?m[0]*=2,main():printf((char*)m);    
}

テストする こちら .

解決方法は?

番号 7709179928849219.0 は、64ビットとして次のような2進数表現があります。 double :

01000011 00111011 01100011 01110101 01010011 00101011 00101011 01000011
+^^^^^^^ ^^^^---- -------- -------- -------- -------- -------- --------

+ は符号の位置を示しています。 ^ は指数を、そして - は、仮数(指数を除いた値)です。

指数と仮数を2進数で表現しているので、2倍にすると指数が1つ増えます。あなたのプログラムはこれを正確に771回行いますので、1075で始まった指数(10進数で表現すると 10000110011 になる。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番目の要素が0になり、ヌルターミネータを提供し、この文字列は、以下のように渡すのに適しています。 printf() .