• ベストアンサー

定数の型について

独習Cという本に「デフォルトでは、Cコンパイラは数値定数を互換性のあるデータ型のうちその数が収まる最小の型であると見なします。intを16ビットと仮定すると、10はデフォルトでintとなり、100003はlongになります。」と書いてあるのですが、なぜ10はshortではなくintになるのですか? 回答お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

規格を確認しましたが, int → unsigned int → long → unsigned long (→ long long → unsigned long long) の順に調べていきます (long long 以降は今の規格に従う場合). 従って, 整定数の型が short になることは (int と short のビット数が同じかどうかとは無関係に) ありえません. たとえ short = 16ビット, int = 32ビット, long = 64ビットの環境でも「10」と書けば (int で表現できるので) 必ず int です.

s5210
質問者

お礼

規格で決められているのですね。 簡潔な回答有り難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答 ・定数はshort型よりint型か標準だから。→『デフォルト』ってことだよ。 ・int型→int型 ・short型→short int型 ・long型→long int型 ・ですのでshort型とint型のビット数が同じならばint型が『デフォルト』になります。 ・分かりますか? ・なお、short型は必ず16ビットの整数で処理したい場合に指定する型です。 ・通常は、int型を使いますか……。→これは、int型が32ビットのとき16ビットの型が  ないと困るのでそのときにshort型を使う。 ・int型、short型、long型のビット数と範囲をよく理解しておきましょう。 ・最後に、回答者 No.2 さんの『規格上』の決め事なのですよ。→shortではなくintになるのは。 ・では、さようなら。→疑問に持った『あなた』はC言語の仕組みをその内理解できるでしょう。

s5210
質問者

お礼

詳しく書かれていたのでよくわかりました。 ご回答どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

整定数の場合, 「int → unsigned int → long → unsigned long」の順に調べるんじゃなかったかなぁ? 歴史的事情で short の定数を書くのは不可能だったはず. ちなみにですが, それぞれの型のビット数は規格上 char ≧ 8ビット short ≧ 16ビット long ≧ 32ビット char ≦ short ≦ int ≦ long しか決まってません.

s5210
質問者

お礼

参考にさせていただきました。 ご回答どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

「intを16ビットと仮定すると」って書いてありますね? int型のビット数は「その処理系で数値を扱う場合の、標準のビット数」です。ここでは「16ビットと仮定」されてます。 short型のビット数は「16ビット」です。 つまり、その「仮定されたコンパイラ」はintもshortも16ビットで、shortって書く意味が無いからです。 「intを16ビットと仮定すると」の中には「intもshortも同じビット数と仮定するなら」と言う仮定が含まれているのですよ。

s5210
質問者

お礼

なるほど、そういう考え方も出来ますね。 ご回答どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C/C++の型について

    Windows2000で、VC++6で型のサイズを調べると、以下のとおりでした。 int 4バイト long 4バイト long int 4バイト 環境はWindows2000, CPUはCeleron1200Mhzです。 環境やコンパイラによって型のサイズや呼び方も変わるのでしょうか? VisualBasic6用のDLLをVCで作成した記憶があるのですが、そのときは VB6のInteger型が2バイトだったので C(Ver7.0?????)側も2バイトだったと思います。 今VB6のInteger型にあわせる場合はC側ではshortでないとおかしくなるのでしょうか? 私はブランクがあり、そのあたりの事情がよくわかっていません。 あるサイトのページを見ると intが2バイトで、 long intは同じ4バイトで long long intという型もありました。VC6++では long long intは無いようです。 http://seclan.dll.jp/c99d/c99d05.htm VC2005++やGCCでは8バイトの型はあるのでしょうか?

  • 型について

    Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

  • C言語の定数のサフィックスについて

    C言語に詳しい方はおバカな質問をしていると思われるかもしれませんが、当方はソフトは初心者なのでご容赦ください。 C言語で定数を扱う際に一定以上のサイズの定数の場合L、UL等のサフィックスを付けないと正常に処理されない(例:0x0123456789ABCDEFという定数はサフィックス無しだと0x89ABCDEFとして処理される)仕様になっている事は把握しているのですが、この一定サイズについてご教授願います。 int、long等は処理系によってサイズが何bitになるかが変わりますが、intが16bitの場合は32bitの定数でもサフィックスにL、UL等を付けなければいけないのでしょうか? それともintのサイズに関係なく32bit以下ならサフィックスは不要で、32bitを超える場合はサフィックスが必要になるのでしょうか? また、処理系に依存せず一定のサイズの変数を宣言するのにint32_t、int64_t等がありますが、サフィックスにも同様に処理系に依存せずサイズを明確にする物はあるのでしょうか? 例えば0x0123456789ABCDEFULLとした場合、long longが32bitの場合は32bitの定数として扱われてしまうと思うのですが、定数を処理系に依存せずに確実に64bitとして処理してほしい場合はどの様にすれば良いのでしょうか? (あるサイトに"GCCではlong longが64bitのサイズになるが言語仕様上はビット長は保証されていない"と言う記載があった事から、サフィクスにLLやULLを使用しても64bitで処理される保証が無いと思い、この質問をさせて頂いています。)

  • C言語の変数の型がわかりません

    C言語の変数の型がわかりません [int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. [long int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. のようなことが書いてあります. [int]と[long int]の違いは何ですか?

  • 型変換キャストについて

    #include <stdio.h> int main( void ) { short a = 30000, b = 10000; long c; c = a + b; printf("%ld",c) return 0; } *ただし,short:2バイト,long:4バイト このプログラムをVisual C++でコンパイルすると 結果は40000とちゃんと表示されるのは何故ですか? shortは2バイトだからshort型のa + bの値は変な値になるはずで,本来次のようにキャストが必要だと思うのですが。 #include <stdio.h> int main( void ) { short a = 30000, b = 10000; long c; c =(long) a + b; printf("%ld",c) return 0; }

  • 型指定子についての教えてください。

    コンパイラはMicrosoft visual C&C++を使用しています。 (1)型指定子のfloat,doubleの大きい数値について。 計算をするとfloatは7桁までは正しくて、7桁より大きい桁はデタラメです。doubleは15桁までは正しくて、15桁より大きい桁はデタラメです。有効数字7桁,15桁とはこういうことでしょうか。 後、floatは有効数字7桁、doubleは有効数字15桁で本当に正しいのでしょうか。 (2)型指定子のfloat,doubleの小数点以下の数字について。 floatは10^-38まで、doubleは10^-308までの数字を扱えると参考書には書いてありますが、計算をしますと小数点以下6桁までは求まりますが、それ以下は求まりまりません。それ以下の数値はすべて0になります。なぜでしょうか。 (3)int,long intとdouble long doubleの違いについて。 intとlong intはともに-2147483648~2147483647までの範囲だと思います。またdoubleとlong doubleはともに有効数字15桁でした。何か違いがあるのでしょうか?

  • C#で型変換がうまくいきません。

    C#で型変換がうまくいきません。 short r; byte[] b = new byte[] {1,2,3}; r = (short)b[1] * (short)256; というコードを書くと、 型 'int' を 'short' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) と出てしまいます。キャストしているのに何がいけないのか全くわかりません。 どうぞ宜しくお願いいたします。

  • VC++6.0でC言語の基本データ型のビット長と範囲をしりたいです

    VC++6.0を使用しています。コマンドラインを使い勉強しているのですが、基本データ型のビット長と使える数の範囲を知りたいです。 たとえば、int型だと32ビットで-32767から32767の範囲の数を扱えるとかを知りたいです。コマンドライン上から調べることはできないのでしょうか? ネットでも書いてあるところがあるならいいのですが、できれば自分の手で調べる方法を見つけたいのです。 ちなみに char, unsigned char, int, unsigned int, short int, unsigned short int, long int unsigned long int, float, double, long doubleなどが知りたいです。 方法を知っている方教えてください。よろしくお願いします。

  • sizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

      数値(整数)型の定義サイズについて、質問です。 ANSIの規格では、 sizeof(short) ≦ sizeof(int) ≦ sizeof(long) としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。 しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、 sizeof(short) → 2 sizeof(int) → 2 sizeof(long) → 4 となっているようです。(手元にないので、gccでは確認していませんが・・・) 実際のところ、上記のサイズにならない処理系は実在するのでしょうか? 何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に > 次の sizeof 演算子の返す値として正しいものはどれですか。 > > long hoge[32]; > sizeof(hoge); > ------------------------------------------------------ > A. 32 > B. 64 > C. 128 > D. 256 > E. 512 という問題が掲載されており、解説が、 > 正解は C 。 > > long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。 となっていたのです。(short型のサイズを問う類題あり) 特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。 sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか? コメントをお待ちしております。  

  • perlの型と8進数、10進数

    ある文字列からsubstrで3桁の数値を切り取り、計算に使いたいのですがゼロ詰めの数値の場合8進数になると思っていたのですが、文字列の場合は10進数の数値になります。 これは仕様でしょうか? perlは型がないので、AもBもCも同じ値だと思っていましたが、 そのあたりについて詳しい方、違いを知っている方教えて頂けますか? #-- A -- my $s = "007008009010"; print int( substr($s, 0, 3) ) . "\n"; print int( substr($s, 3, 3) ) . "\n"; print int( substr($s, 6, 3) ) . "\n"; print int( substr($s, 9, 3) ) . "\n"; print; #-- B -- print int("007") . "\n"; print int("008") . "\n"; print int("009") . "\n"; print int("010") . "\n"; print; #-- C -- print int(007) . "\n"; # 7 #print int(008) . "\n"; #print int(009) . "\n"; print int(010) . "\n"; # 8

    • ベストアンサー
    • Perl