一般的にC言語のint型は、メモリ上では2進法で、負の数は2の補数で表現されるものですが、これはCの規格上定められているものでしょうか?

2進法以外で整数値を表現するCの処理系というのはありえるのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/05/10 15:38:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:dev_zer0 No.1

回答回数332ベストアンサー獲得回数25

ポイント60pt

intは規格上では

・+32767~-32767が表現可能であること

・sizeof short <= sizeof int <= sizeof longであること

しか定められていません。


例えば1の補数などで表現することも可能であり、そういう処理系も作ろうと思えば作ることができますが、

私が知っているコンパイラで2の補数以外の表現をしているコンパイラはないです。


2の補数だと正負を意識することなく加減算が行える為、これ以外の方法は面倒な上に利点がないと思われます。

id:Sampo

ありがとうございました。

2006/05/10 15:37:40
  • id:villain
    int 型は標準の整数型ですがサイズは特に決められていません。
    OSや環境、プラットフォームなどによってまちまちです。
    通常は使用しているCPUやOSのbit数で表現できる最大値です。
    (8bit CPUでは8bit, 16bit CPUでは16bit, 32bit CPUでは
    32bit, 64bit CPUでは64bitを表現可能です)

    http://www2.ocn.ne.jp/~cbmaho/homepage/vc/Help/int.htm

    実際には各CPUに対応したOSや処理系のbit数に影響するので
    64bit CPU上でも32bit CPU向けに作成されたOSや処理系では
    32bitまでしか利用できません。
    また、処理系によっては32bit(以外も含)環境でも64bit整数を
    扱える__int64や16bit整数を表現する__int16などのような型も
    あります。
    (場合によっては__int8や__int128というのもあります)

    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclang/html/_langref___int8.2c_.__int16.2c_.__int32.2c_.__int64.asp

  • id:Sampo
    どちらにしろ、内部表現までは規格で定められていないのですね。

    質問の元々の意図は、ゼロクリアした配列は、intの0が並んでいるものと解釈していいのか、という疑問からでした。

    もちろん大抵の場合そう解釈していいに決まっているのですが、情報科学系の学生レポートを評価するにあたってでしたので、完全に処理系依存しない手法なのか明らかにしておきたかったのです。
  • id:kurukuru-neko

    大型計算機(Univac)で1の補数の処理系は昔あったと
    思います。(36bit CPU,1文字=9bit)

    UNIVAC ClearPath IX(OS2200)がまだ販売されている
    ようなので動作する処理系がまだあるかも知れません。




  • id:kurukuru-neko

    整数の配列を0でクリアするの意味であれば
    大丈夫と思いますが。 クリアの意味を勘違いして
    配列を0クリアすると考えてしまった場合、
    バイナリー(int 0)が0と勘違いする可能性があります。
    該当するデータタイプで初期化するのが正しいように思います。

    例: 浮動小数点の0がint 0とは違う可能性ががあります。



  • id:Sampo
    0クリアというのは、calloc()関数によるビットクリアのことです。
    calloc()で確保したint配列を、0で初期化されていると扱って組んだプログラムを素直に正解と判断できるか、という問題でした。
  • id:kurukuru-neko

    微妙ですね。

    新人の教育担当であれば、整数の場合は仕方なく正解を
    あげるしかない気がします。
    将来構造体を使った時にも同じようにされると困る場合が
    あるので代入で初期化する別の方法を推奨したいな・・

    理解度を確認するために、意地悪かもしれないですが
    設問をすこし見直して整数だけでなく、不動小数点でも
    動作する制約をつけるか関数の呼び出しをmallocに
    限定したい気がします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません