

大学で1000000÷65536の整数商と余りを計算，表示するプログラムをC言語で作るという課題が出ました．ただし，除算記号‘/’，モジュロ演算子’%’の使用，各種ライブラリ関数の使用が禁止です．ループ構造も使用禁止，ついでに加算，減算記号．ビットシフト‘<<‘，‘>>‘も禁止．もちろん，あらかじめ計算しておいて，その結果だけ表示するのも禁止です．各種ライブラリ関数の例外として，表示用のprintf関数は使用できます．回答よろしくお願いいたします．

**実行例:**

[code]

    > ./a.out
    1000000/65536=15...16960
    
[/code]


CC BY-SA 4.0
2023-06-16T15:09:40.687
95265
2023-06-18T03:58:04.747
2023-06-17T05:15:40.390
3060
58755
question
c
C言語で1000000÷65536の整数商と余りを計算，表示するプログラムを本文の条件で作りたいです．

[code]

    #include <stdio.h>
    
    int main() {
      int a = 1000000 & ~65535;
      short *b = (short *)&a;
      printf("1000000/65536=%d...%d\n", b[0] ? b[0] : b[1], 1000000 & 65535);
    }
    
[/code]


CC BY-SA 4.0
2023-06-16T19:55:12.823
95266
2023-06-18T03:58:04.747
2023-06-18T03:58:04.747
47127
47127
95265
answer


まず前提としてプログラミング言語 C には言語仕様上で未規定としている項目がかなりたくさんあります。
コンピュータには様々な設計がありうるため、それらの都合に合わせられるように言語の側で細部を決めていない部分があるのです。

課題の意図はその課題が提示された文脈から読み取らないといけないでしょう。

コンピュータアーキテクチャについての文脈であった場合は (言語仕様として保証していなくても)
対象のコンピュータの特性を利用することを意図しているでしょうし、プログラミング言語の文脈では言語仕様の細部を読む訓練なのかもしれません。

コンピュータの特性に頼る事例は metropolis 氏が提示しており、境界調整やエンディアンについて特性を活用しています。
逆に言えばコンピュータの特性によっては意図した結果になりません。

言語仕様で保証している範囲に厳密 (なつもり) な例を私は考えてみました。

[code]

    #include <stdio.h>
    
    int main(void) {
        long foo = 1000000;
    
        printf("1000000/65536=%d...%ld\n",
               (foo & 65536 ? 1 : 0) 
               | (foo & 131072 ? 2 : 0) 
               | (foo & 262144 ? 4 : 0) 
               | (foo & 524288 ? 8 : 0) 
               | (foo & 1048576 ? 16 : 0) 
               | (foo & 2097152 ? 32 : 0)
               | (foo & 4194304 ? 64 : 0)
               | (foo & 8388608 ? 128 : 0),
               foo & 65535);
    }
    
[/code]


CC BY-SA 4.0
2023-06-18T02:29:28.673
95280
2023-06-18T02:29:28.673
3364
95265
answer