モジュラスを用いたC加算
質問
私は、以下のような興味深いCのコードに出会いました。
A + B
を表示する興味深いCコードに出会いましたが、理解するのに苦労しています。
入力フォーマットです。
A B
ここで
A
,
B
の間の整数です。
0
と
10
をスペース1つで区切ってください。
コード
main( n )
{
gets( &n );
printf("%d", n % 85 - 43);
}
これは短いコーディングを意図したもので、警告は気にしないでください。
ここまでで理解できたこと
gets( &n )
の下位3バイトにA, space, BのASCII値を格納します。
n
. 例えば
A = 3
と
B = 8
は
n = 0x00382033
. 与えられた条件によって
n
がオーバーフローするのを防ぎます。しかし、私はどのように
n % 85 - 43
は
A + B
.
どうやってこの数字を出すんだ?
どのように解決するのですか?
リトルエンディアンの int で (そして ASCII テキスト、8 ビットバイト、その他コードが必要とするすべての前提を仮定して)、コード内の技術的に間違っているモダン C のものをすべて無視して、あなたの "What I understand so far" は正しいのです。
gets(&n)
の最初の 3 バイトに A、スペース、および B の ASCII 値を格納します。
n
. また、4バイト目にはヌルターミネーターが格納されます。これらの ASCII 値をこれらのバイトに格納すると
n
のこれらのバイトに格納すると
n
が値をとる
B*256*256 + space*256 + A
である。
B
,
space
そして
A
は対応するASCII値を表します。
256 mod 85は1なので、モジュラー算術の特性により。
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
ちなみに、4バイトのビッグエンディアンのint型では、次のようになります。
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
というわけで、4バイトのintであればエンディアンは関係ありません。(例えば8バイトのintだと
n
その
gets
が設定されなかった)
スペースはASCII32で、数字文字のASCII値は48+数字の値です。定義する
a
と
b
を入力された数字の数値(数字文字のASCII値ではなく)とすると、次のようになります。
(B + space + A) % 85 = (b + 48 + 32 + a + 48) % 85
= (a + b + 128) % 85
= (a + b + 43) % 85
(B + space + A) % 85 - 43 = (a + b + 43) % 85 - 43
= (a + b) % 85
= a + b
ここで、最後の2つの等価性は、以下の事実に依存しています。
a
と
b
は0から9の値をとります。
関連
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
未定義の `__isoc99_sscanf' への参照
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] CまたはC++を使用して、ディレクトリ内のファイルのリストを取得するにはどうすればよいですか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
-
[解決済み】標準ライブラリを使ってアライメントされたメモリのみを割り当てるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
関数 'malloc' の暗黙の宣言に対する解決策
-
initializer element is not constant "というエラーが表示されるのですが?
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] mallocで文字列を確保する
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] ストラクチャーとユニオンの違い