数値(整数)型の定義サイズについて、質問です。
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 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか?
コメントをお待ちしております。
No.1ベストアンサー
- 回答日時:
64ビットマシン向けの商用UNIXのほとんどでは、
sizeof(long)は 8
となっているはずです。(LP64モデルを採用)
ちなみに、
Win64では 4 のままです。(LLP64モデルを採用)
さらに重箱の隅をつつくようで申し訳ないですが、IA32向けのVC++や、BCCでは、sizeof(int)は 2 ではなく 4 を返しますね。ご確認を。
参考まで。
コメントありがとうございます。
> 64ビットマシン向けの商用UNIXのほとんどでは、
> sizeof(long)は 8
> となっているはずです。(LP64モデルを採用)
ということは、
> 規格の定義上は正しくなくても、実務上は誤りとは言えないような気もします
はとんでもない話で、この内容では、テキスト(教材)としての品質に大いに問題がありそうですね。
クレーム(修正要求)を付けた方がいいかな?
> IA32向けのVC++や、BCCでは、sizeof(int)は 2 ではなく 4 を返します
おっしゃる通りです。
ご指摘ありがとうございます。
No.4
- 回答日時:
学校で
char=1Byte
int=2Byte
long=4Byte
short型なんて一言も触れないと言う授業やってます。
int型は大体CPUの通常の整数演算の型に合わせることが多いです。
VC++6で確認したら
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(hoge)=128
という結果が出ました。
Windows95以降は32BitCPUです。
質問にはint=2と書いてありますがそうではないようです。
char,short,longが1,2,4Byteでない処理系は聞いたことありませんが(下の回答見てるとあるようですが)intは昔は2Byte今は4Byteが多いようです。
学校で使われてる教科書はint=-32768~32767なんて書いてあるから2Byteでしょう。
しかも処理系によって換わるなんて一言も書いてありません。
C言語のint型は2Byteみたいに書いてます。
おそらくほとんどの処理系が16Bitだったころに編集した教科書を今でもそのまま使ってるのでしょう。
このような教科書を作るのも問題だしこのような教科書を使ってそのまま授業やってint=2Byteという間違った知識を教えてる学校も問題だと思います。
この回答への補足
> このような教科書を作るのも問題だしこのような教科書を使ってそのまま授業やってint = 2Byteという間違った知識を教えてる学校も問題だと思います。
コメントありがとうございます。
一生VBしか使わないなら、その認識でもOKですが。(^-^;
(あっ、VB6.0 → VB.NET でint = 4Byte に変わるからダメだわ(-_-;)
結局、この件は、内容の不備として作者に連絡し、修正してもらうことにしました。
コメントを頂いた皆様、ありがとうございました。m(_ _)m
No.3
- 回答日時:
やはり、そのテキストの記述は間違っているとしか思えません。
そうならない処理系がいまは実在しなくても将来的には存在するでしょうし、C言語の仕様でサイズが決まっていない以上、正しいと言うことは絶対にできません。
絶対的なサイズとしては、char型は1バイト、と言うことしか決められていません。
> やはり、そのテキストの記述は間違っているとしか思えません。
コメントありがとうございます。
良質な解説書では、型のサイズの問題に加え、ハードウェアアーキテクチャ(Intel系/モトローラ系)によるエンディアンの相違についても言及されている場合が多いと思うのですが、問題の書籍では、移植性や可搬性への配慮が欠けているような気がします。
No.2
- 回答日時:
現在のC言語においてはhiroyapapaのおっしゃるとおりlong型が8バイト体型
になっているコンパイラは実在します。私が仕事で使っているのも8バイト体型です。
で、質問者は「long型32個の配列による容量は128バイトは間違いである可能性もある」
ということを読み取りましたが、私の見解では「まぁ、正しいんじゃないの?」と
読み取っています。
なぜなら、質問者がお使いの書籍の書版がいつなのかが明記されていないため、
4年あたりくらい前に初めて作られた書籍ならともかく、さらに古くから作られている
本と考えるならlong型が8バイト使うものは当時としてはあまり存在しない、すなわち
long型は4バイトであると決めうちしている時代であったため、問題として適切と判断されるのです。
#「5年くらい前にはすでにlongは8バイト体型になっているものがあるのを知ってるぞ」なんて
つっこみはとりあえずなしにして下さい。少なくても自分は3年前あたりからlong8バイト
体型でコンパイルされるものがあるのを初めて知りました。(^^;
あと、実際問題として、いまだにlong=4バイトとして広く使われている(≒知名度が高い)
ということもあります。これは質問者も明記されていますよね。実務上の云々とありますが、
学習で使われているコンパイラがlong=4バイト仕様なら少なくても現段階においては
実務上問題ないのではないでしょうか。質問者がlong型=8バイト仕様をご存知なら
コンパイル環境が変わったときにコンパイラの仕様を調べるいうことでいかがでしょう。
もっとも、今現在使用しているコンパイル環境がlong型=8バイト仕様で教科書が4バイト仕様
というのは大問題ではありますが・・・。
もしよろしければお使いの本の初版と改訂日を確認の上、本の冒頭にある前書きあたりに
あるコンパイル環境を調べてみて下さい。改訂が古ければ書籍自体の間違いに当たりませんし、
たいていは前書きに「前提」が書かれているものと思われます。
コメントありがとうございます。
> なぜなら、質問者がお使いの書籍の書版がいつなのかが明記されていない
残念ながら、その情報も開示致しかねます。m(_ _)m
> 実際問題として、いまだにlong=4バイトとして広く使われている
おっしゃる通りですが、現実にlongが8バイトである処理系が存在するとのことですので、やはり教材としては不適切かと思います。
> 前書きに「前提」が書かれているものと思われます。
前書きに前提条件を明示する執筆者なら、この設問で出題するとは思えません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- 英語 "long"→「腰がある」、「粘りがある」という意味が辞書に掲載されていないのはなんでですのん? 5 2023/06/27 17:14
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
「1TB」のHDDに日本語は何字入...
-
半角、全角の判別方法
-
バイト列とバイナリ列の違いが...
-
文字数を取得したい
-
Javaで日本語1文字のバイト数
-
UTF-8コードの正規表現
-
【ActionScript】全角半角の判...
-
Console.writeLineで文字化け
-
memcmp バイナリデータの比較方法
-
UNICODE対応にするメリットは?
-
機種依存文字をチェックしたい。
-
CRC計算方法
-
SQLで1バイト、2バイト混在...
-
sizeof(long), sizeof(short)...
-
リトルエンディアンのデータを...
-
char str[256]の256の意味は?
-
varchar(M)のMは文字数ですかバ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
C++ Builderで文字列をバイトに...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
「1TB」のHDDに日本語は何字入...
-
GetWindowTextでアドレスバーか...
-
ピクセル,dpiから容量(バイト...
-
【VB2005】テキストボックス内...
-
URLは最高何文字まで可能なので...
-
64bit対応
-
UCS-2の一覧表が欲しい
-
VBAでUnicodeしか存在しない文...
-
SQLで1バイト、2バイト混在...
-
ビットスワップとバイトスワッ...
-
CRC計算方法
おすすめ情報